【问题标题】:Pass a data.frame column name to a function that uses purrr::map将 data.frame 列名传递给使用 purrr::map 的函数
【发布时间】:2018-06-04 16:44:18
【问题描述】:

我正在使用嵌套数据框,并且希望将顶级数据框的名称和包含较低级别数据框的列的名称传递给使用 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 中,将读取“数据”的字符串传递给新列。我想我从这里的线程 (Pass a data.frame column name to a function) 中理解了为什么它的行为不像我想要的那样,但我无法弄清楚如何让它在这种情况下工作。任何建议都会很棒。

【问题讨论】:

    标签: r dataframe purrr


    【解决方案1】:

    这应该对你有用,它使用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)
    
    }
    

    【讨论】:

    • 如果col_name 不必是一个字符串,这样它就可以被懒惰地评估,那就太好了。知道这将如何工作吗?
    • @slhck 如果您想向它传递一个裸列名称而不是字符串,我已经更新了我的答案以包含该函数的示例。
    猜你喜欢
    • 2011-02-08
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    相关资源
    最近更新 更多