【问题标题】:specify dplyr column names [duplicate]指定 dplyr 列名 [重复]
【发布时间】:2014-02-18 20:08:47
【问题描述】:

如果我不知道列名但想通过变量指定它,如何将列名传递给 dplyr?

例如这有效:

require(dplyr)
df <- as.data.frame(matrix(seq(1:9),ncol=3,nrow=3))
df$group <- c("A","B","A")
gdf <- df %.% group_by(group) %.% summarise(m1 =mean(V1),m2 =mean(V2),m3 =mean(V3))

但这不是

require(dplyr)
someColumn = "group"
df <- as.data.frame(matrix(seq(1:9),ncol=3,nrow=3))
df$group <- c("A","B","A")
gdf <- df %.% group_by(someColumn) %.% summarise(m1 =mean(V1),m2 =mean(V2),m3 =mean(V3))

【问题讨论】:

  • 是的,可能。我最终在 dplyr 链之前重命名了组列。类似colnames(df)[which(colnames(df)==someColumn)] &lt;- "group"
  • 值得注意的是,“正确”的答案可能与 dplyr 0.7.0 下的解决方案不同。

标签: r group-by columnname dplyr


【解决方案1】:

这是这个直截了当的问题的答案,通过挑选哈德利对他发布的欺骗的解决方案获得。

gdf <- df %.% regroup( lapply( someColumn, as.symbol)) %.% summarise(m1 =mean(V1),m2 =mean(V2),m3 =mean(V3))

FWIW,我的用例涉及按一个变量列和一个常量列分组。解决方法是:

gdf <- df %.% regroup( lapply( c( 'constant_column', someColumn), as.symbol)) %.% summarise(m1 =mean(V1),m2 =mean(V2),m3 =mean(V3))

最后,发布的eval 解决方案不起作用。这只会创建一个新列,其值都是 someColumn evals 的值。

【讨论】:

    【解决方案2】:

    你可以如下使用summarise_:

    plotVar         = "Stocks_US_TotalCrudeOil"
    dfBand <- mydf[ c( plotVar ,  "year", "week"  )  ] %>%
                filter ( year %in% bandYears )   %>%
                group_by (  week )   %>% 
                summarise_ (   ymini =  paste( "min(" ,  as.name(plotVar)  ,")"  ) 
                             , ymaxi =  paste( "max(" ,  as.name(plotVar)  ,")"  )     )
    dfBand
    

    【讨论】:

      【解决方案3】:

      我刚刚在Group by multiple columns in dplyr, using string vector input 给出了类似的答案,但为了更好的衡量标准:允许您使用字符串对列进行操作的函数已添加到dplyr。它们与常规的dplyr 函数同名,但以下划线结尾。功能在this vignette中有详细描述。

      鉴于来自 OP 的 dfsomeColumn,现在这是一种享受:

      gdf <- df %>% group_by_(someColumn) %>% summarise(m1=mean(V1),m2=mean(V2),m3=mean(V3))
      

      请注意,它是group_by_,而不是group_by,并且%&gt;% 运算符用作%.% 已弃用。

      【讨论】:

      • 你能指定m1为函数中传递的变量名吗?
      【解决方案4】:

      pollutant <- "sulfate"
      summarise(data, mean(eval(as.symbol(pollutant)), na.rm = TRUE))
      

      我试图针对我自己的问题提出同样的问题。然后我找到了解决方案。 我用 eval(as.symbol()) 封装了表达式。

      【讨论】:

      • 似乎不适用于我当前版本的 dplyr
      【解决方案5】:

      我希望你只需要使用 eval

      require(dplyr)
      someColumn = "group"
      df <- as.data.frame(matrix(seq(1:9),ncol=3,nrow=3))
      df$group <- c("A","B","A")
      gdf <- df %.% group_by(eval(someColumn)) %.% summarise(m1 =mean(V1),m2 =mean(V2),m3 =mean(V3))
      

      【讨论】:

      • 这根本不起作用,只需添加一个名为eval(someColumn) 的新列,其中每一行都是"group"
      猜你喜欢
      • 2018-02-27
      • 2020-11-30
      • 2017-06-19
      • 2016-08-06
      • 1970-01-01
      • 2015-04-17
      • 2014-03-20
      • 2016-07-05
      • 2021-10-30
      相关资源
      最近更新 更多