我正在寻找一种基于两个条件来分配新列的简单方法。例如,在下面的示例中,如果我们有val1存在(例如“1”,而不是“0”),我们为新列分配月份所代表的数字(Jan = 1,Feb = 2,March = 3 , 等等)。在R中寻找最简单的方法。任何想法?
Month val1 new-column April 0 0 May 0 0 April 1 4 June 1 6 Jan 0 0 Feb 0 0
答案 0 :(得分:3)
你可以尝试
df$new_column <- match( substr(df$Month, 1,3), month.abb)*df$val1
df$new_column
#[1] 0 0 4 6 0 0
df <- structure(list(Month = c("April", "May", "April", "June", "Jan",
"Feb"), val1 = c(0L, 0L, 1L, 1L, 0L, 0L)), .Names = c("Month",
"val1"), class = "data.frame", row.names = c(NA, -6L))
答案 1 :(得分:3)
如果您示例中的月份只是其他数据(不是日期)的占位符,则可以将“月”转换为因子,然后使用ifelse
:
df$Month <- as.factor(df$Month)
df$newCol <- ifelse(df$val1 != 0, as.numeric(df$Month), 0)
> df
Month val1 newCol
1 April 0 0
2 May 0 0
3 April 1 1
4 June 1 4
5 Jan 0 0
6 Feb 0 0
使用@akrun的数据。
通过这种方式,您可以使用可以为因子定义的levels
。所以你需要确保你的因子水平按照你需要的顺序定义(例如,第一级是“四月”,所以newCol是1,六月是4级)。
答案 2 :(得分:2)
你可以使用带有对应关系的data.frame(有几个月或任何你想要的东西):
equiv<-data.frame(month(c("Jan","Feb","March","April","May","June"),num=1:6,stringsAsFactors=F)
> equiv
month num
1 Jan 1
2 Feb 2
3 March 3
4 April 4
5 May 5
6 June 6
然后再做(也使用@akrun数据):
df$val2<-0
df$val2[which(df$val1==1)]<-equiv$num[match(df$Month[which(df$val1==1)],equiv$month)]
> df
Month val1 val2
1 April 0 0
2 May 0 0
3 April 1 4
4 June 1 6
5 Jan 0 0
6 Feb 0 0
答案 3 :(得分:2)
尝试data.table版本:
> library(data.table)
> ddt = data.table(ddf)
>
> ddt[,new_column:=ifelse(val1==1, match(Month, month.abb),0),]
> ddt
Month val1 new_column
1: Apr 0 0
2: May 0 0
3: Apr 1 4
4: Jun 1 6
5: Jan 0 0
6: Feb 0 0
月份条目保留为缩写,因为主要问题是如何组合2个条件以获得新列。
数据:
> dput(ddf)
structure(list(Month = structure(c(1L, 5L, 1L, 4L, 3L, 2L), .Label = c("Apr",
"Feb", "Jan", "Jun", "May"), class = "factor"), val1 = c(0L,
0L, 1L, 1L, 0L, 0L)), .Names = c("Month", "val1"), class = "data.frame", row.names = c(NA,
-6L))