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

Mat*_*lan 2 r dataframe purrr

我正在处理嵌套数据帧,并希望将顶级数据帧的名称和包含低级数据帧的列的名称传递给使用 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
Run Code Online (Sandbox Code Playgroud)

testfunc1 的行为符合预期,在这种情况下,给出新列中每个数据列的最小值。在 testfunc2 中,我试图传递列名,读取“数据”的字符串被传递到新列。我想我从这里的线程(将 data.frame 列名传递给函数)理解为什么这不像我想要的那样,但我无法弄清楚如何在这种情况下使其工作。任何建议都会很棒。

TBT*_*BT8 5

这应该对你有用,它使用整洁的 eval框架。这假设 col_name 是一个字符串。

testfunc2 <- function(df, col_name) {
     df <- df %>%
          mutate(out = map(!! rlang::sym(col_name), min))
    tibble(min2 = df$out)

}
Run Code Online (Sandbox Code Playgroud)

编辑:

如果您更愿意将裸列名称而不是字符串传递给函数,请使用enquo代替sym.

testfunc2 <- function(df, col_name) {
     col_quo = enquo(col_name)
     df <- df %>%
          mutate(out = map(!! col_quo, min))
     tibble(min2 = df$out)

}
Run Code Online (Sandbox Code Playgroud)