根据两个条件为新列分配值

时间:2014-11-13 14:38:37

标签: r

我正在寻找一种基于两个条件来分配新列的简单方法。例如,在下面的示例中,如果我们有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

4 个答案:

答案 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))
相关问题