如何在 dplyr 中的 purrr 映射中使用动态变量

how to use dynamic variable in purrr map within dplyr

我有以下看起来像这样的数据:

tibble(
  name = paste0("segment",1),
  data = list(tibble(segment1 = 1:5, check = 99))
)

# A tibble: 1 x 2
  name     data            
  <chr>    <list>          
1 segment1 <tibble [5 x 2]>

我想映射嵌套数据并想在 dplyr 中使用变量(名称)。如果列名 segment1 是 2 而不是 66 否则使用来自列 segment1

的值
tibble(
  name = paste0("segment",1),
  data = list(tibble(segment1 = 1:5, check = 99))
) %>% 
  
  mutate(testing = map2(.x = name, .y = data, 
                        ~ .y %>% 
                            mutate(testing = ifelse((!!.x) == 2, 66, (!!.x))))) 

未嵌套的测试小标题应如下所示:

# A tibble: 5 x 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

但我总是收到无法找到 .x 的错误。

.x已经用于map2,最好使用匿名函数,清楚哪个变量指的是什么。

使用字符串变量作为列名 .data 代词应该可以,但我很惊讶它在这里不起作用(或者我没有正确使用它)。另一种方法是使用 get.

library(dplyr)
library(purrr)

tibble(
  name = paste0("segment",1),
  data = list(tibble(segment1 = 1:5, check = 99))
) %>%
  mutate(testing = map2(name, data, function(p, q) {
    q %>% mutate(testing = ifelse(get(p) == 2, 66, get(p)))
  })) 

#   name     data             testing         
#  <chr>    <list>           <list>          
#1 segment1 <tibble [5 × 2]> <tibble [5 × 3]>

其中 testing 列中的数据是

# A tibble: 5 x 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