如何在R中对列表内多个数据框的指定列应用修改?
批量处理列表中数据框的指定列累积求和操作
问题背景
我需要对列表df_list中的每个数据框,仅针对第7到18列执行累积求和操作。单个数据框的处理逻辑已经实现:
原始数据框示例
LoB cc AY AQ age inj_part Pay00 Pay01 Pay02 Pay03 Pay04 Pay05 Pay06 Pay07 Pay08 Pay09 Pay10 Pay11 1603528 1 1 1997 1 15 10 573 0 0 0 0 0 0 0 0 0 0 0 2135181 1 1 1999 1 15 10 439 0 0 0 0 0 0 0 0 0 0 0 3005060 1 1 2001 1 15 10 46 0 0 0 0 0 0 0 0 0 0 0 3140988 1 1 2001 1 15 10 349 0 0 0 0 0 0 0 0 0 0 0 4280242 1 1 2004 1 15 10 345 0 0 0 0 0 0 0 0 0 0 0 4992637 1 1 2005 1 15 10 811 0 0 0 0 0 0 0 0 0 0 0
单个数据框的处理代码
df[7:18] <- do.call("cbind", Reduce(`+`, df[7:18], accumulate = TRUE))
处理后的数据框示例
LoB cc AY AQ age inj_part Pay00 Pay01 Pay02 Pay03 Pay04 Pay05 Pay06 Pay07 Pay08 Pay09 Pay10 Pay11 1603528 1 1 1997 1 15 10 573 573 573 573 573 573 573 573 573 573 573 573 2135181 1 1 1999 1 15 10 439 439 439 439 439 439 439 439 439 439 439 439 3005060 1 1 2001 1 15 10 46 46 46 46 46 46 46 46 46 46 46 46 3140988 1 1 2001 1 15 10 349 349 349 349 349 349 349 349 349 349 349 349 4280242 1 1 2004 1 15 10 345 345 345 345 345 345 345 345 345 345 345 345 4992637 1 1 2005 1 15 10 811 811 811 811 811 811 811 811 811 811 811 811
现在需要将这个逻辑应用到列表df_list中的所有数据框,使用lapply实现批量处理。
解决方案
直接将单个数据框的处理逻辑封装到lapply的匿名函数中即可,代码如下:
使用标准匿名函数(兼容所有R版本)
result <- lapply(df_list, function(x) { # 对当前数据框的7-18列执行累积求和 x[7:18] <- do.call("cbind", Reduce(`+`, x[7:18], accumulate = TRUE)) # 返回修改后的完整数据框 return(x) })
使用R 4.1+的箭头函数(更简洁)
result <- lapply(df_list, \(x) { x[7:18] <- do.call("cbind", Reduce(`+`, x[7:18], accumulate = TRUE)) x })
说明
lapply会遍历df_list中的每个数据框,将其传入匿名函数作为参数x- 在函数内部,仅修改
x的第7到18列,其他列保持不变 - 修改完成后返回完整的
x,最终result会是一个包含所有处理后数据框的新列表
内容的提问来源于stack exchange,提问作者JGM
相关产品推荐
相关产品推荐

