我想按组聚合日期 . 然而,每个观察可以属于几个组(例如,观察1属于组A和B) . 我找不到用 data.table
实现这个目标的好方法 . 目前,我为每个可能的组创建了一个逻辑变量,如果观察属于该组,则该变量的值为 TRUE
. 我正在寻找一种比下面提供的更好的方法 . 我也想知道如何用 tidyverse
实现这一目标 .
library(data.table)
# Data
set.seed(1)
TF <- c(TRUE, FALSE)
time <- rep(1:4, each = 5)
df <- data.table(time = time, x = rnorm(20), groupA = sample(TF, size = 20, replace = TRUE),
groupB = sample(TF, size = 20, replace = TRUE),
groupC = sample(TF, size = 20, replace = TRUE))
# This should be nicer and less repetitive
df[groupA == TRUE, .(A = sum(x)), by = time][
df[groupB == TRUE, .(B = sum(x)), by = time], on = "time"][
df[groupC == TRUE, .(C = sum(x)), by = time], on = "time"]
# desired output
time A B C
1: 1 NA 0.9432955 0.1331984
2: 2 1.2257538 0.2427420 0.1882493
3: 3 -0.1992284 -0.1992284 1.9016244
4: 4 0.5327774 0.9438362 0.9276459
3 回答
这是一个
data.table
的解决方案:或者(以thx到@ chinsoon12为评论)更多编程:
如果您想要长格式的结果,您可以:
我认为这里以长格式工作更容易 . 首先,我将观察结果收集到长格式,然后仅保留观察属于相应组的值 . 然后我删除逻辑列,并将组重命名为单个字母 . 然后我在组和时间之间进行汇总(总结在
dplyr
中) . 最后,我又回到了广泛的格式 .产量
一个选项可以将
tidyr
和dplyr
包与data.table
结合使用 . 尝试以长格式处理数据,然后将其更改为宽格式 .