使用purrr的map2_df过滤数据集时遇长度不匹配错误的技术求助
解决
map2_df过滤字符串变量名时的报错问题 你的问题出在字符串形式的变量名无法直接在filter()中使用——x$vbl.name是字符串向量(比如"dbp"),而dplyr::filter()默认需要的是变量符号(直接写dbp)。当你直接写.x < .y时,R会把.x当成长度为6的字符串向量,和你的数据集647行的长度不匹配,所以抛出了长度不兼容的错误。
正确的两种实现方式
方法1:使用.data代词(dplyr推荐)
.data[[.x]]可以让dplyr根据字符串名称引用对应的变量,这是最直观且符合现代dplyr规范的写法:
library(purrr) library(dplyr) x <- tibble( vbl.name = c("dbp","plat", "plat.b", "fib", "bili", "osat"), observed.min = c(25, 33, 33, 0.1, 0, 0.84), expected.min = c(50, 50, 50, 1, 1, 47) ) # 修正后的代码 map2_df(.x = x$vbl.name, .y = x$expected.min, .f = ~{ my_data %>% filter(.data[[.x]] < .y) %>% # 可选:添加列标记是哪个变量超出范围 mutate(out_of_range_var = .x) })
方法2:使用非标准求值(sym + !!)
如果你习惯用rlang的非标准求值语法,可以把字符串转为符号后注入到filter中:
map2_df(.x = x$vbl.name, .y = x$expected.min, .f = ~{ var_sym <- rlang::sym(.x) my_data %>% filter(!!var_sym < .y) %>% mutate(out_of_range_var = .x) })
额外说明
添加mutate(out_of_range_var = .x)是为了让最终的结果表明确每条记录是哪个变量不符合预期范围,方便后续分析——如果没有这一步,合并后的结果会丢失变量来源信息,排查起来会很麻烦。
内容的提问来源于stack exchange,提问作者martin
相关产品推荐
相关产品推荐

