[英]Pass a data.frame column name to a function that uses purrr::map
我正在使用嵌套数据框,并希望将顶层数据框的名称以及包含较低层数据框的列的名称传递给使用purrr :: map遍历较低层数据框的函数。
这是一个玩具示例。
library(dplyr)
library(purrr)
library(tibble)
library(tidyr)
df1 <- tibble(x = c("a","b","c", "a","b","c"), y = 1:6)
df1 <- df1 %>%
group_by(x) %>%
nest()
testfunc1 <- function(df) {
df <- df %>%
mutate(out = map(data, min))
tibble(min1 = df$out)
}
testfunc2 <- function(df, col_name) {
df <- df %>%
mutate(out = map(col_name, min))
tibble(min2 = df$out)
}
df1 <- bind_cols(df1, testfunc1(df1))
df1 <- bind_cols(df1, testfunc2(df1, "data"))
df1$min1
df1$min2
testfunc1的行为符合预期,在这种情况下,将在新列中提供每个数据列的最小值。 在testfunc2中,我尝试传递列名,将读取“数据”的字符串传递给新列。 我想我从这里的线程中了解了( 将data.frame列名传递给函数 )为什么这种行为不符合我的期望,但是我无法弄清楚在这种情况下如何使其工作。 任何建议都很好。
这应该为您工作,它使用整洁的评估框架。 假设col_name是一个字符串。
testfunc2 <- function(df, col_name) {
df <- df %>%
mutate(out = map(!! rlang::sym(col_name), min))
tibble(min2 = df$out)
}
编辑:
如果您希望将裸列名称(而不是字符串)传递给函数,请使用enquo
而不是sym
。
testfunc2 <- function(df, col_name) {
col_quo = enquo(col_name)
df <- df %>%
mutate(out = map(!! col_quo, min))
tibble(min2 = df$out)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.