将 data.frame 列名传递给使用 purrr::map 的函数

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" 被传递到新列。我想我从这里的线程 (Pass a data.frame column name to a function) 中理解了为什么这不像我想要的那样运行,但我一直无法弄清楚如何让它在这种情况下工作。任何建议都会很棒。

这应该适合您,它使用 tidy eval 框架。这假设 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)

}