如何在 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
我有以下看起来像这样的数据:
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