You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按id分组对variable为V1的value求和并写入组内所有行

解决data.table中分组计算并填充到Total行的问题

我有如下data.table数据:

library(data.table)

dt <- data.table("value" = c(10,15,30,55,20,10,40,70,80,20,40,140),
                 "id" = c(1,1,1,1,2,2,2,2,3,3,3,3),
                 "variable" = c("V1","V1","V1","Total","V1","V1","V1","Total",
                                "V1","V1","V1","Total"))

输出的数据结构:

value id variable
 1:    10  1       V1
 2:    15  1       V1
 3:    30  1       V1
 4:    55  1    Total
 5:    20  2       V1
 6:    10  2       V1
 7:    40  2       V1
 8:    70  2    Total
 9:    80  3       V1
10:    20  3       V1
11:    40  3       V1
12:   140  3    Total

需求是:按id分组,仅计算variable=="V1"时value列的总和,同时将该总和显示在variable为Total的行中。

尝试过以下代码,但variable为Total的行中sum_value为NA:

dt[variable != "Total", sum_value := sum(value), by = id]

得到的结果:

value id variable sum_value
 1:    10  1       V1        55
 2:    15  1       V1        55
 3:    30  1       V1        55
 4:    55  1    Total        NA
 5:    20  2       V1        70
 6:    10  2       V1        70
 7:    40  2       V1        70
 8:    70  2    Total        NA
 9:    80  3       V1       140
10:    20  3       V1       140
11:    40  3       V1       140
12:   140  3    Total        NA

期望的结果:

value id variable sum_value
 1:    10  1       V1        55
 2:    15  1       V1        55
 3:    30  1       V1        55
 4:    55  1    Total        55
 5:    20  2       V1        70
 6:    10  2       V1        70
 7:    40  2       V1        70
 8:    70  2    Total        70
 9:    80  3       V1       140
10:    20  3       V1       140
11:    40  3       V1       140
12:   140  3    Total       140

解决方案

之前的代码仅给variable != "Total"的行赋值,导致Total行未被填充。可以通过以下几种方式实现需求:

方法1:直接在分组内计算并赋值所有行

dt[, sum_value := sum(value[variable == "V1"]), by = id]

在每个id组内,仅筛选variable=="V1"的value求和,再将该值赋值给组内所有行(包括Total行)。

方法2:先计算统计量再合并回原表

如果需要更清晰的步骤,可以先单独计算每个id的V1总和,再关联到原表:

sum_dt <- dt[variable == "V1", .(sum_value = sum(value)), by = id]
dt <- dt[sum_dt, on = "id"]

方法3:基于原代码修正填充NA

如果想保留原代码的基础逻辑,可以取组内非NA值填充所有行:

dt[variable != "Total", sum_value := sum(value), by = id]
dt[, sum_value := sum_value[1], by = id]  # 取组内第一个非NA值填充

内容的提问来源于stack exchange,提问作者anon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 22:15:06