如何一步聚合data table:按日期分组,数值列取均值其余列取首值
用data.table按日期分组聚合的解决方案
嘿,这个需求用data.table来实现超简洁的,刚好匹配你要的效果!我直接给你上代码和解释:
首先,先把你给的示例数据转换成data.table格式(如果还没转的话):
library(data.table) # 构造你的示例数据 my_table <- data.table( name = c("test", "test", "test", "test"), date = as.POSIXct(c("2018-04-04", "2018-04-04", "2018-04-05", "2018-04-06")), value = c(1, 2, 8, 3) )
接下来就是核心的聚合操作了,按date分组,对value取均值,name取每组的第一个值:
# 执行分组聚合 aggregated_table <- my_table[, .( name = first(name), # 提取每组的第一个name值 value = mean(value) # 计算每组value的平均值 ), by = .(date)] # 分组依据是date列
这里解释下:因为我们是按date分组,所以date列在结果里会自动保留每个分组的唯一日期值,不用额外处理;first()函数专门用来取分组内的第一个元素,完美适配你的字符列需求;mean()就是常规的均值计算啦。
运行完后,你要的结果就出来了:
print(aggregated_table) # name date value # 1: test 2018-04-04 1.5 # 2: test 2018-04-05 8.0 # 3: test 2018-04-06 3.0
要是你的表有多个字符列或数值列,也可以批量处理,不用一个个写:
比如如果还有字符列category和数值列score,可以这么写:
# 批量处理多列的情况 multi_col_result <- my_table[, c( # 对所有目标字符列取第一个值 lapply(.SD[, .(name, category), with = FALSE], first), # 对所有目标数值列取均值 lapply(.SD[, .(value, score), with = FALSE], mean) ), by = .(date)]
内容的提问来源于stack exchange,提问作者s6hebern
相关产品推荐
相关产品推荐

