我想知道如何将变量名列表传递给purrr::map2
函数,以便在单独的数据帧上进行迭代。
下面的input_table$key
变量包含mpg
数据集中的disp
和mtcars
。我认为变量名称是作为字符串而不是变量名称传递的。问题是我该如何更改它,以便我的函数识别出它们是变量名(?)。
在此示例中,我试图求和mtcars
变量mpg
和disp
中所有低于一组数字阈值的值。来自mtcars
的那些变量和相关阈值包含在input_table
(如下)中。
percentile key value sum_y
<fct> <chr> <dbl> <dbl>
1 0.5 mpg 19.2 266.5
2 0.9 mpg 30.1 515.8
3 0.99 mpg 33.4 609.0
4 1 mpg 33.9 642.9
5 ... ... ... ...
library(dplyr)
library(purrr)
library(tidyr)
# Arrange a generic example
# Replicating my data structure
input_table <- mtcars %>%
as_tibble() %>%
select(mpg, disp) %>%
map_df(quantile, probs = c(0.5, 0.90, 0.99, 1)) %>%
mutate(
percentile = factor(c(0.5, 0.90, 0.99, 1))
) %>%
select(
percentile, mpg, disp
) %>%
gather(key, value, -percentile)
# Defining the function
test_func <- function(label_desc, threshold) {
mtcars %>%
select({{label_desc}}) %>%
filter({{label_desc}} <= {{threshold}}) %>%
summarise(
sum_y = sum(as.numeric({{label_desc}}), na.rm = T)
)
}
# Demo'ing that it works for a single variable and threshold value
test_func(label_desc = mpg, threshold = 19.2)
# This is where I am having trouble
# Trying to iterate over multiple (mpg, disp) variables
map2(input_table$key, input_table$value, ~test_func(label_desc = .x, threshold = .y))
答案 0 :(得分:1)
问题是卷曲的({{}}
)用于首次引用时未引用的变量。在您的第二次尝试中,您传递了卷曲卷曲运算符不起作用的带引号的变量。一个简单的解决方法是使用_at
的{{1}}变体,它接受带引号的参数。
dplyr