任务:对于所有 condition==FALSE
,将 groupmean 设置为 group
的所有数字
的平均值。
对于所有 condition==TRUE
,仅当 condition==TRUE
按 group
时,才将 groupmean 设置为 numbers
的平均值。
我想要一个不需要复制整个 data.table 但添加所需列的解决方案。我打赌有一个简单的解决方案,但我有点迷失了......
到目前为止我的尝试:
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
最佳答案
您应该颠倒定义groupmean
的顺序。将其计算为所有行的组平均值,然后替换 condition == TRUE
的行。
DT[, groupmean:=mean(numbers), by=group]
DT[condition==TRUE, groupmean:=mean(numbers), by='group,condition']
希望有帮助
关于R数据.表: adding new column for subset of rows conditional on all rows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23513901/