繁体   English   中英

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

[英]Assigning a value to a new column based on two conditions

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

你可以试试

 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))

如果您示例中的月份只是其他数据(不是日期)的占位符,则可以将“月”转换为因子,然后使用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 所以你需要确保你的因子水平按照你需要的顺序定义(例如,第一级是“April”,所以newCol是1,6月是4级)。

你可以使用带有对应关系的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

试试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))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM