r - 聚合每个观察是否可以属于多个组
问题描述
我想按组聚合日期。然而,每个观察可以属于几个组(例如观察 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
解决方案
这是一个解决方案data.table
:
df[, lapply(.SD[, .(groupA, groupB, groupC)]*x, sum), time]
# > df[, lapply(.SD[, .(groupA, groupB, groupC)]*x, sum), time]
# time groupA groupB groupC
# 1: 1 0.0000000 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
或者(感谢@chinsoon12 的评论)以编程方式:
df[, lapply(.SD*x, sum), by=.(time), .SDcols=paste0("group", c("A","B","C"))]
如果您想要长格式的结果,您可以执行以下操作:
df[, colSums(.SD*x), by=.(time), .SDcols=paste0("group", c("A","B","C"))]
### with indicator for the group:
df[, .(colSums(.SD*x), c("A","B","C")), by=.(time), .SDcols=paste0("group", c("A","B","C"))]
推荐阅读
- gmail - Gmail 以下链接(Gmail 内容采样)
- javascript - 如何以多步骤形式将 URL 中的电子邮件添加到隐藏的电子邮件表单字段?
- python - 复制后奇怪的numpy数组赋值
- java - 删除数组中的字符串
- python - python:将每个元素转换为列表中的字符串,而不使用for循环
- python - 如何让不和谐 api 忽略不和谐用户?
- bitbucket - AWS Code PipeLine 未获取 BitBucket 帐户的所有存储库
- docker - 我的反应 docker 网页没有绑定到主机
- c# - 将学生的实例存储到数组中
- excel - Excel - 在表列中使用切片器和小计数字,同时忽略用另一列标识的重复值