R语言使用lapply传递数据框与变量向量调用函数报错求助
问题与解决方案
问题场景
现有两个数据框和一个自定义过滤函数,传入单个物种参数时可正常运行:
library(tidyverse) iris1<-iris iris2<-iris iris_fn<-function(df,species_type){ df1<-df%>% filter((Species==species_type)) return(df1)} # 单个参数调用正常 new_df<-iris_fn(df=iris1, species_type="setosa")
需要传入物种向量c("setosa","versicolor","virginica"),得到包含3个对应物种过滤结果的数据框列表,尝试lapply时触发错误:
variables<-c("setosa","versicolor","virginica") new_df<-lapply(df=iris1, species_type="setosa", FUN= iris_fn)
错误提示:Error in is.vector(X) : argument "X" is missing, with no default
错误原因
lapply的第一个参数必须是要迭代的对象(即这里的物种向量variables),你错误地将固定参数df=iris1放在了第一个参数位置,且未传入需要迭代的variables,导致函数找不到核心迭代对象而报错。
解决方案
1. 使用lapply实现
将物种向量作为第一个参数传入,通过...传递固定的df参数给自定义函数:
variables<-c("setosa","versicolor","virginica") # 针对iris1生成物种过滤结果列表 new_df_list <- lapply(variables, FUN = iris_fn, df = iris1) # 给列表命名,方便识别对应物种 names(new_df_list) <- variables
如果需要同时处理iris1和iris2两个数据框,可嵌套lapply:
# 先把两个数据框放进列表 df_list <- list(iris1 = iris1, iris2 = iris2) # 生成嵌套列表:外层是原数据框,内层对应各物种的过滤结果 all_results <- lapply(df_list, function(current_df) { lapply(variables, iris_fn, df = current_df) %>% set_names(variables) })
2. 使用purrr包实现(tidyverse风格)
purrr的map函数语法更直观,适合tidyverse生态:
# 单个数据框的情况 new_df_purrr <- map(variables, iris_fn, df = iris1) %>% set_names(variables) # 同时处理两个数据框的情况 all_results_purrr <- map(df_list, ~{ map(variables, iris_fn, df = .x) %>% set_names(variables) })
内容的提问来源于stack exchange,提问作者Basil
相关产品推荐
相关产品推荐

