R语言如何将含for循环的功能改写为lapply处理列表内数据框
错误原因
- 参数命名冲突:你给
lapply匿名函数的入参命名为df_list,和外部的全局列表变量重名,函数内部访问到的df_list是每次迭代传入的单个数据框,不是外层的列表对象,调用df_list[[i]]相当于对数据框用列表索引规则取子集,自然触发类型错误。 - 循环逻辑错误:
lapply本身已经承担了遍历列表所有元素的功能,不需要嵌套额外的for循环。你写的for(i in df_list[[i]]$b)逻辑完全不成立:i未定义就用来做索引,且遍历对象是b列的数值,后续用来当df_names的下标也会出现匹配错误。 - 返回值错误:你在循环中计算的
df_double没有作为函数结果返回,最后返回的还是未修改的原始数据,就算没有报错也得不到预期输出。
修正代码
你单独运行的测试代码逻辑是:取出单个数据框的b列转为数值乘2,作为列表元素,对应匹配df_names的名称,按这个需求给出标准实现:
# 方法1:base R原生实现,遍历索引匹配名称 df2_list <- lapply(seq_along(df_list), function(i) { as.numeric(df_list[[i]]$b) * 2 }) names(df2_list) <- df_names
如果你需要保留完整数据框,仅修改b列的值,使用以下代码:
df2_list <- lapply(seq_along(df_list), function(i) { current_df <- df_list[[i]] current_df$b <- as.numeric(current_df$b) * 2 current_df }) names(df2_list) <- df_names
运行后查看df2_list$first即可得到第一个数据框处理后的结果,和你单独测试的输出一致。
内容的提问来源于stack exchange,提问作者LT17
相关产品推荐
相关产品推荐

