使用lapply时自定义R函数未按预期工作的问题求助
解决lapply批量处理时数据框标识变量赋值错误的问题
这个问题我太熟悉啦!核心原因在于你用deparse(substitute(z))获取变量名的方式——在lapply循环里,函数参数z每次指代的都是循环临时变量,substitute(z)拿到的永远是符号z,而不是原始数据框的名字(x_data或y_data),所以所有数据框的x_or_y都被判定为"y"。
下面给你两种可靠的解决方案:
方案一:用Map同时传递数据和名称(基础R实现)
我们直接把列表的元素名称作为参数传给函数,彻底绕开substitute的局限性:
第一步:修改自定义函数
让函数接受两个参数:数据框本身,以及对应的名称字符串:
add_x_or_y <- function(z, df_name) { z$x_or_y <- ifelse(grepl(pattern = "x", df_name, fixed = TRUE), "x", "y") z }
第二步:用Map批量调用
Map可以把列表的元素和它的名称一一对应传入函数:
x_y_list <- list(x_data = x_data, y_data = y_data) x_y_list <- Map(add_x_or_y, x_y_list, names(x_y_list))
方案二:用purrr::imap简化代码(tidyverse风格)
如果你习惯用tidyverse工具,purrr包的imap函数会自动把列表元素的名称作为第二个参数传递,代码更简洁:
第一步:加载所需包(如果未安装先安装)
install.packages(c("purrr", "dplyr")) library(purrr) library(dplyr)
第二步:批量处理
用imap结合dplyr::mutate一行搞定:
x_y_list <- imap(x_y_list, ~ mutate(.x, x_or_y = ifelse(grepl("x", .y), "x", "y")))
这里.x代表列表中的数据框,.y就是对应的元素名称。
验证结果
现在你可以查看处理后的结果,确认x_or_y变量已经正确赋值:
# 查看x_data的结果 head(x_y_list$x_data) # 查看y_data的结果 head(x_y_list$y_data)
内容的提问来源于stack exchange,提问作者TheNerdyCat
相关产品推荐
相关产品推荐

