任务:对于所有condition==FALSE
,请将groupmean设置为numbers
的所有group
。
对于condition==TRUE
,numbers
只有condition==TRUE
group
的所有set.seed(42)
require(data.table)
DT <- data.table(condition=sample(c(TRUE,FALSE), 50, replace=T),
group=rep(LETTERS[1:4], times=25),
numbers=1:100)
# modifies the right rows, but wrong value
DT[condition==FALSE, groupmean_1 := mean(numbers), by=group]
# right values, but not only rows where condition=FALSE
DT[, groupmean_2 := mean(numbers), by=group]
head(DT)
condition group numbers groupmean_1 groupmean_2
1: FALSE A 1 42.66667 49
2: FALSE B 2 55.68421 50
3: TRUE C 3 NA 51
4: FALSE D 4 47.78947 52
5: FALSE A 5 42.66667 49
6: FALSE B 6 55.68421 50
集合意味着{{1}}。
我想有一个解决方案,不需要复制整个data.table但添加所需的列。我敢打赌这是一个简单的解决方案,但我迷失了一点......
到目前为止我的尝试:
{{1}}
答案 0 :(得分:2)
您应该颠倒定义groupmean
的顺序。将其计算为所有行的组平均值,然后替换condition == TRUE
之后的行。
DT[, groupmean:=mean(numbers), by=group]
DT[condition==TRUE, groupmean:=mean(numbers), by='group,condition']
我希望有帮助