如何基于分组变量筛选data.table指定列并计算最大值?
嘿,我懂你遇到的问题啦!查了好多帖子还是没搞定,对吧?你有一个带多列的data.table,想要筛选出部分列,再按分组变量对这些列求最大值汇总,我来给你一步步解决。
首先先把你的示例数据补全(你写的Q24_LOC_1代码没写完,我帮你补完整啦):
library("data.table") set.seed(1200) ID <- seq(1001,1100) region <- sample(1:10,100,replace = T) Q21 <- sample(1:5,100,replace = T) Q22 <- sample(1:15,100,replace = T) Q24_LOC_1 <- sample(1:8,100,replace = T) # 创建data.table对象 dt <- data.table(ID, region, Q21, Q22, Q24_LOC_1)
接下来分两种常见场景给你解决方案:
场景1:明确知道要筛选的列名
如果你清楚知道要处理哪些列(比如Q21、Q22、Q24_LOC_1),可以直接指定列名来操作:
# 按region分组,对指定列求最大值 dt_summary <- dt[, lapply(.SD, max), by = region, .SDcols = c("Q21", "Q22", "Q24_LOC_1")]
给你拆解一下这段代码:
by = region:告诉data.table按region这个变量分组.SDcols = c("Q21", "Q22", "Q24_LOC_1"):指定要进行计算的列(也就是你想筛选出来的列)lapply(.SD, max):对.SD(也就是.SDcols指定的列集合)里的每一列应用max函数,算出每组的最大值
场景2:列名有规律(比如都以Q开头)
如果你的目标列有统一的命名规律(比如都是以Q开头),不用手动列所有列名,用正则匹配更高效:
# 筛选所有以Q开头的列,按region分组求最大值 dt_summary <- dt[, lapply(.SD, max), by = region, .SDcols = patterns("^Q")]
这里patterns("^Q")会自动匹配所有列名以Q开头的列,非常适合列数多的情况。
最后你可以打印结果看看:
print(dt_summary)
要是你需要按多个变量分组(比如同时按region和另一个变量),只需要在by里添加变量就行,比如by = .(region, another_variable)。
内容的提问来源于stack exchange,提问作者user1412
相关产品推荐
相关产品推荐

