r - R - 以不同方式聚合 data.table 列
问题描述
我得到一个需要根据第一列聚合的大型数据表:
问题如下:
- 对于几列,只需形成每个类别的总和(在第 1 列中给出)
- 对于其他列,必须计算平均值
- 第一列和第二列中的条目之间存在 1-1 对应关系。这样应该保留第二列的条目。
以下是此类数据表的一个可能示例。假设需要对第 3-9 列求和,对第 10-12 列求平均。
library(data.table)
set.seed(1)
a<-matrix(c("cat1","text1","cat2","text2","cat3","text3"),nrow=3,byrow=TRUE)
M<-do.call(rbind, replicate(1000, a, simplify=FALSE)) # where m is your matrix
M<-cbind(M,matrix(sample(c(1:100),3000*10,replace=TRUE ),ncol=10))
M <- as.data.table(M)
结果应该是表格的表格
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12
1: cat1 text1 27 81 78 95 27 22 12 76 18 76
2: cat2 text2 38 48 70 100 11 97 8 53 56 33
3: cat3 text3 58 18 66 24 14 73 18 27 92 70
但与条目相应的总和各自的平均值。
解决方案
M[, names(M)[-c(1,2)] := lapply(.SD, as.numeric),
.SDcols = names(M)[-c(1,2)]][,
c(lapply(.SD[, ((3:9)-2), with=FALSE], sum),
lapply(.SD[, ((10:12)-2), with=FALSE], mean)),
by = eval(names(M)[c(1,2)])]
#> V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12
#> 1: cat1 text1 51978 49854 48476 49451 49620 49870 50248 50.193 51.516 49.694
#> 2: cat2 text2 50607 50097 50572 50507 48960 51419 48905 49.700 49.631 48.863
#> 3: cat3 text3 51033 50060 49742 50345 51532 51299 50957 50.192 50.227 50.689
推荐阅读
- delphi - 如何修复单行程序中的 TWebBrowser 内存泄漏?德尔福 10.3
- firebase - 一旦你在一个事件上调用了 dispose(),它就不能再使用了,因为有多个 QuerySnapshots
- reactjs - 使用 formik 单击新的选择下拉菜单后 Recat 复选框
- pandas - 如何从 Pandas 数据框中删除包含空单元格但值为 0 的行?
- php - 在 WooCommerce 管理订单页面中保留和显示产品自定义字段值
- flask-restplus - 如何在 flask-restplus/flask-restx 的有效负载中指定通用字典?
- excel - VBA | 如何计算不同值的出现次数?
- python-3.x - 在python中如何在不使用replace方法和使用join方法的情况下替换字符串中的子字符串?
- html - 任何用于在元素的所有子元素中缩放 css 字体大小的灵丹妙药?
- reactjs - 将 React.memo() 与输入一起使用是个好主意吗?