如何在dplyr的purrr map调用中使用动态变量
问题原因
报错的核心是tidy evaluation(整洁求值)的执行顺序逻辑:!! 操作符会在内部mutate调用时立刻求值,此时外层map2还未将.x替换为name列的实际取值,因此R会提示找不到.x对象。
解决方案
有两种常用写法可以实现动态列引用:
写法1:使用.data代词(更简洁)
直接用.data[[动态列名字符串]]的格式引用对应列,不需要处理符号转换:
library(tidyverse) result <- tibble( name = paste0("segment",1), data = list(tibble(segment1 = 1:5, check = 99)) ) %>% mutate(testing = map2(.x = name, .y = data, ~ .y %>% mutate(testing = ifelse(.data[[.x]] == 2, 66, .data[[.x]])))) %>% unnest(testing) # 解嵌套后直接得到你要的5行3列结果
写法2:先转符号再解引用
如果你习惯用!!的写法,需要先把列名字符串转成符号再解引用:
result <- tibble( name = paste0("segment",1), data = list(tibble(segment1 = 1:5, check = 99)) ) %>% mutate(testing = map2(.x = name, .y = data, ~ .y %>% mutate(testing = ifelse(!!sym(.x) == 2, 66, !!sym(.x))))) %>% unnest(testing)
两种写法运行后解嵌套的结果都和你预期的一致:
# A tibble: 5 × 3 segment1 check testing <int> <dbl> <dbl> 1 1 99 1 2 2 99 66 3 3 99 3 4 4 99 4 5 5 99 5
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

