如何在data.table末尾添加列求和的新行?
在data.table结果末尾添加求和行的实现方法
原操作与结果
你最初的筛选分组计算代码:
dt[x1 == 1, .N, by = c("Group1")][, "%" := round(N /sum(N) * 100, 0)]
得到的初始结果:
Group1 N % 1: 2 6 40 2: 1 6 40 3: 3 2 13 4: 5 1 7
你需要在表格末尾追加一行求和数据,期望效果:
Group1 N % 1: 2 6 40 2: 1 6 40 3: 3 2 13 4: 5 1 7 ColSum: -- 15 100
实现方法
可以通过构造求和行再合并的方式完成,下面提供两种写法:
分步写法(清晰直观)
# 先保存初始计算结果 result <- dt[x1 == 1, .N, by = c("Group1")][, "%" := round(N / sum(N) * 100, 0)] # 构造求和行:Group1设为"--",N列取总和,%列取总和(若要确保显示100,可直接赋值100) sum_row <- data.table( Group1 = "--", N = sum(result$N), `%` = sum(result$`%`) ) # 合并结果并自定义行标识 final_result <- rbindlist(list(result, sum_row)) print(final_result, row.names = c(1:nrow(result), "ColSum:"))
链式写法(一步到位)
dt[x1 == 1, .N, by = c("Group1")][, "%" := round(N / sum(N) * 100, 0)][, rbind(.SD, .(Group1 = "--", N = sum(N), `%` = sum(`%`)))] |> print(row.names = c(1:(.N-1), "ColSum:"))
补充说明
- 由于
%列是四舍五入后的结果,求和可能出现微小误差(示例中刚好凑成100),如果需要强制显示100,直接把sum(result$%)替换为100即可 - 通过
print的row.names参数自定义最后一行的标识,就能实现你要的ColSum:效果
内容的提问来源于stack exchange,提问作者dapple-putt-poultry
相关产品推荐
相关产品推荐

