将参数数据帧传递给 pmap (purrr)
passing a dataframe of parameters to pmap (purrr)
按照 Hadley Wickams 的指导 r for data science ,我想将参数数据框传递给用户定义的函数。
但是,由于参数作为字符存储在数据帧 (df_params) 中,我在评估时遇到了问题 - 特别是评估我的 df 参数。例如,这里有一个函数:
`f <- function(df, group1, region1) {
g1 <- as.name(group1)
reg1 <- enquo(region1)
x <- filter(df, (!!g1) == !!reg1) %>% select(country)
print(x)
}
我通过 f(df, 'group', 'region') 没问题。但是,我希望 f('df', 'group', 'region') 将 'df' 评估为我的全局环境中的对象而不是字符。
我假设(希望)通过解决这个问题我将能够通过
df_params %>% pmap(f)
感谢任何帮助。
您没有提供数据,所以我创建了一些假数据来演示您的解决方案。您正在寻找的可能是 get()
函数。
首先是一些假数据
> df1 <- data.frame(animal1 = rep(c('cat','dog'),5),
+ animal2 = c(rep(c('cat','snake','dog'),3), 'dog'),
+ country = c('USA','USA','USA','NK','NK','NK','NK','USA','MEX','MEX'),
+ stringsAsFactors = F)
animal1 animal2 country
1 cat cat USA
2 dog snake USA
3 cat dog USA
4 dog cat NK
5 cat snake NK
6 dog dog NK
7 cat cat NK
8 dog snake USA
9 cat dog MEX
10 dog dog MEX
这是您当前的函数,输出如下:
> f <- function(df, group1, region1) {
+ g1 <- as.name(group1)
+ reg1 <- enquo(region1)
+ x <- filter(df, (!!g1) == !!reg1) %>% select(country)
+ print(x)
+ }
>
> f(df1, 'animal1', 'dog')
country
1 USA
2 NK
3 NK
4 USA
5 MEX
我们可以通过简单地将 get(df)
添加到您的过滤器函数来修改它。你可以看到它给了我们相同的输出。
> f2 <- function(df, group1, region1) {
+ g1 <- as.name(group1)
+ reg1 <- enquo(region1)
+ x <- filter(get(df), (!!g1) == !!reg1) %>% select(country)
+ print(x)
+ }
>
> f2('df1', 'animal1', 'dog')
country
1 USA
2 NK
3 NK
4 USA
5 MEX
按照 Hadley Wickams 的指导 r for data science ,我想将参数数据框传递给用户定义的函数。
但是,由于参数作为字符存储在数据帧 (df_params) 中,我在评估时遇到了问题 - 特别是评估我的 df 参数。例如,这里有一个函数:
`f <- function(df, group1, region1) {
g1 <- as.name(group1)
reg1 <- enquo(region1)
x <- filter(df, (!!g1) == !!reg1) %>% select(country)
print(x)
}
我通过 f(df, 'group', 'region') 没问题。但是,我希望 f('df', 'group', 'region') 将 'df' 评估为我的全局环境中的对象而不是字符。
我假设(希望)通过解决这个问题我将能够通过
df_params %>% pmap(f)
感谢任何帮助。
您没有提供数据,所以我创建了一些假数据来演示您的解决方案。您正在寻找的可能是 get()
函数。
首先是一些假数据
> df1 <- data.frame(animal1 = rep(c('cat','dog'),5),
+ animal2 = c(rep(c('cat','snake','dog'),3), 'dog'),
+ country = c('USA','USA','USA','NK','NK','NK','NK','USA','MEX','MEX'),
+ stringsAsFactors = F)
animal1 animal2 country
1 cat cat USA
2 dog snake USA
3 cat dog USA
4 dog cat NK
5 cat snake NK
6 dog dog NK
7 cat cat NK
8 dog snake USA
9 cat dog MEX
10 dog dog MEX
这是您当前的函数,输出如下:
> f <- function(df, group1, region1) {
+ g1 <- as.name(group1)
+ reg1 <- enquo(region1)
+ x <- filter(df, (!!g1) == !!reg1) %>% select(country)
+ print(x)
+ }
>
> f(df1, 'animal1', 'dog')
country
1 USA
2 NK
3 NK
4 USA
5 MEX
我们可以通过简单地将 get(df)
添加到您的过滤器函数来修改它。你可以看到它给了我们相同的输出。
> f2 <- function(df, group1, region1) {
+ g1 <- as.name(group1)
+ reg1 <- enquo(region1)
+ x <- filter(get(df), (!!g1) == !!reg1) %>% select(country)
+ print(x)
+ }
>
> f2('df1', 'animal1', 'dog')
country
1 USA
2 NK
3 NK
4 USA
5 MEX