如何基于NA值特定条件合并多个data.table并计算perf均值
合并多个data.table并按条件计算perf列平均值
我来帮你搞定这个问题!要合并多个结构相同的data.table,并按row_names分组计算perf的平均值,同时满足**只要分组内存在NA值就不执行均值计算(返回NA)**的要求,咱们可以按以下步骤操作:
步骤1:加载data.table包并准备示例数据
首先确保你已经加载了data.table包,然后定义你的示例数据表:
library(data.table) dt1 <- data.table(row_names=1:5, perf=c(2,NA,NA,3,NA), ticker=rep("aa",5)) dt2 <- data.table(row_names=1:5, perf=c(NA,1,2,5,NA), ticker=rep("aapl",5))
步骤2:合并所有data.table
用rbindlist()函数可以高效合并多个同结构的data.table,只需要把所有表放进一个列表里传入即可:
combined_dt <- rbindlist(list(dt1, dt2))
步骤3:按row_names分组并计算符合条件的均值
这里我们需要先判断每个分组内的perf值是否全部为非NA,只有满足这个条件时才计算均值,否则返回NA:
result_dt <- combined_dt[, .(avg_perf = if(all(!is.na(perf))) mean(perf) else NA_real_), by = row_names]
代码解释:
by = row_names:指定按row_names字段进行分组all(!is.na(perf)):检查当前分组里的所有perf值是否都不是缺失值- 条件成立时计算
mean(perf)(因为全是非NA值,不需要额外处理);不成立时返回NA_real_(保证结果列是数值类型,避免类型混乱)
最终结果
运行上述代码后,result_dt的输出如下:
row_names avg_perf 1: 1 NA 2: 2 NA 3: 3 NA 4: 4 4 5: 5 NA
如果你实际需求是忽略NA值计算非NA数据的均值(哪怕分组里有NA也计算),可以用更简单的代码:
result_dt <- combined_dt[, .(avg_perf = mean(perf, na.rm = TRUE)), by = row_names]
此时输出会是:
row_names avg_perf 1: 1 2 2: 2 1 3: 3 2 4: 4 4 5: 5 NaN
内容的提问来源于stack exchange,提问作者road_to_quantdom
相关产品推荐
相关产品推荐

