【发布时间】:2020-04-30 21:30:28
【问题描述】:
我希望使用 data.table 根据其他两个列条件创建一个新列。这是我的示例代码:
group <- c(1,1,1,2,2,2,3,3,3,4,4,4)
date <- c(6,2,3,7,6,9,7,1,4,6,8,9)
val1<- c("","A","A","","A","A","","A","A","","A","A")
df1<-data.frame(group,date,val1)
dt1<-as.data.table(df1)
这是输出:
group date val1
1 6
1 2 A
1 3 A
2 7
2 6 A
2 9 A
3 7
3 1 A
3 4 A
4 6
4 8 A
4 9 A
鉴于每个组 (1,2,3,4) 中的 val1 = A,我希望找到日期的最小值,如下所示:
group date val1 findmin
1 6
1 2 A Y
1 3 A
2 7
2 6 A Y
2 9 A
3 7
3 1 A Y
3 4 A
4 6
4 8 A Y
4 9 A
我试过了
dt1[,findmin:= ifelse(date=min(date[val1 == "A"])),"Y","", by = group]
阅读为:如果 date minimum date where val1 = "A",则在名为 'findmin' 的新列中添加“Y”,否则不添加任何内容,并对每个组执行此操作 (1,2,3,4) .我收到此错误:
Error in `[.data.table`(dt1, , `:=`(findmin, ifelse(min(date[val1 == "A"]))), :
Provide either by= or keyby= but not both
感谢您的帮助,谢谢!
【问题讨论】:
-
ifelse的括号没有正确闭合。"Y"和""部分需要在ifelse(...)函数内。您还在比较部分使用=而不是==。试试dt1[,findmin:= ifelse(date==min(date[val1 == "A"]),"Y",""), by = group] -
你可能想阅读
?data.table::fifelse
标签: r if-statement data.table min