R数据.表: adding new column for subset of rows conditional on all rows

标签 r data.table

任务:对于所有 condition==FALSE,将 groupmean 设置为 group 的所有数字的平均值。 对于所有 condition==TRUE,仅当 condition==TRUEgroup 时,才将 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/

相关文章:

r - 数据表元编程

r - 根据 id 向量中的匹配进行过滤

r - 为什么 data.table 通过引用更新名称(DT),即使我分配给另一个变量?

r - 避免矩阵索引中的循环

c++ - 无法编译R包

r - 省略某些值时如何创建桑基图

R 使用 data.table 中的条件查找波高于给定值的频率和持续时间

r - 如何在 R 中创建 for 循环来进行这种特殊的计算

r - 如何删除 R 中的第 99 个百分位异常值

R:对向量执行计算