R语言管道操作中用Reduce合并lapply输出为数据框报错
错误原因
Reduce()行末尾多余的悬空逗号导致管道传参错位:magrittr的%>%默认将上一步输出作为当前函数的第一个未赋值参数传入,末尾逗号让参数解析逻辑混乱,误将上游传入的lapply结果列表放到了Reduce()要求传入函数的f参数位,最终触发“找不到模式为function的'.'对象”的报错。- 重命名步骤引用了不存在的
results对象:整个流程中没有定义过results变量,管道内前一步合并得到的数据框会直接传入setnames()作为处理对象,colnames(results)的写法会因为对象不存在触发新报错,即使全局环境有同名变量,也不是本次流程实时生成的合并结果,列名匹配会出错。
修正代码
保留原有lapply+Reduce+setnames的逻辑,仅修正传参错误:
# 按需加载依赖,使用setnames需加载data.table library(dplyr) library(data.table) plist <- list(SOM_V, SOM_SD, SOM_C, SOM_L, SOM_M, SOM_KD, SOM_MP, SOM_SvD) plist %>% lapply(response, p = "f76a") %>% # 去掉末尾多余逗号,用.显式指定上游列表为Reduce的遍历对象 Reduce(function(df1,df2) full_join(df1,df2, by = "y"), x = .) %>% # 直接对管道传入的合并结果按顺序重命名,无需调用不存在的results对象 setnames(new = c('y','Vänsterpartiet','Socialdemokraterna','Centerpartiet','Liberalerna', 'Moderaterna', 'Kristdemokraterna', 'Miljöpartiet', 'Sverigedemokraterna'))
如果习惯用tidyverse生态,可以用更简洁的写法,不需要手动写Reduce的匿名合并函数:
library(tidyverse) plist <- list(SOM_V, SOM_SD, SOM_C, SOM_L, SOM_M, SOM_KD, SOM_MP, SOM_SvD) plist %>% map(response, p = "f76a") %>% reduce(full_join, by = "y") %>% set_names(c('y','Vänsterpartiet','Socialdemokraterna','Centerpartiet','Liberalerna', 'Moderaterna', 'Kristdemokraterna', 'Miljöpartiet', 'Sverigedemokraterna'))
内容的提问来源于stack exchange,提问作者Nick Olczak
相关产品推荐
相关产品推荐

