【问题标题】:Concatenating words without quotes in R for groupby in dplyr在 dplyr 中为 groupby 连接 R 中不带引号的单词
【发布时间】:2016-08-08 04:39:43
【问题描述】:

我有涉及大量列连接 (8-12) 的数据集,同时根据情况可能不需要这些列的 1-3。

目前我一直在使用 dplyr 写出这些长长的分组,但是有这么多的列和不断变化的情况,很容易拼错或忘记一个列。

我想以某种方式创建一个与此相关的变量,但由于尝试使用粘贴时出现的引号,我无法弄清楚如何创建。谁能告诉我如何做到这一点的快速示例?

例如:

  library(dplyr)

    # I want this group-list not to have quotes so I can drop in my group_by below
   my_group_list = paste0("vs"," ","am") #quotes get in the way

   mtcars %>% group_by(my_group_list) %>% summarise(countofvalues = n())

【问题讨论】:

    标签: r group-by concatenation dplyr


    【解决方案1】:

    我知道这是一个非常陈旧的线程,但我碰巧找到了一个更新的答案。你可以使用group_by_at() 和整洁的选择助手(我在这个dplyr issue 上找到了它)。例如:

    my_group_list <- c("vs", "am")
    mtcars %>%
       group_by_at(all_of(my_group_list)) %>%
       summarise(countofvalues = n())
    # `summarise()` regrouping output by 'vs' (override with `.groups` argument)
    # A tibble: 4 x 3
    # Groups:   vs [2]
    #      vs    am countofvalues
    #    <dbl> <dbl>         <int>
    # 1     0     0            12
    # 2     0     1             6
    # 3     1     0             7
    # 4     1     1             7
    

    【讨论】:

      【解决方案2】:

      如果有很多列,我们可以指定要分组的列,而不是直接对列名进行子集化。在这种情况下,请使用group_by_

      library(dplyr)
      mtcars %>%
           group_by_(.dots=names(.)[8:9]) %>% 
           summarise(countofvalues = n())
      #     vs    am countofvalues
      #   (dbl) (dbl)         (int)
      #1     0     0            12
      #2     0     1             6
      #3     1     0             7
      #4     1     1             7
      

      如果我们有 vector 的值,上述方法也有效

      my_group_list <- c("vs", "am")
      mtcars %>%
            group_by_(.dots = my_group_list) %>%
            summarise(countofvalues = n())
      #    vs    am countofvalues
      #  (dbl) (dbl)         (int)
      #1     0     0            12
      #2     0     1             6
      #3     1     0             7
      #4     1     1             7
      

      正如 OP 提到它没有进行分组,我们可以通过 uniteing 'vs' 和 'am' 列对其进行测试,将其用作分组变量,然后执行 n()

      library(tidyr)
      mtcars %>%
            unite(vs_am, vs, am) %>%
            group_by(vs_am) %>% 
            summarise(countofvalues = n())
      #  vs_am countofvalues
      #  (chr)         (int)
      #1   0_0            12
      #2   0_1             6
      #3   1_0             7
      #4   1_1             7
      

      【讨论】:

      • @runningbirds 它确实由两者分组。例如,如果你想用规范的方式检查,mtcars %&gt;% group_by(vs, am) %&gt;% summarise(countofvalues = n()) 输出是一样的
      • 谢谢。有没有办法避免列位置引用,而是引用命名列表或值向量?
      • @runningbirds 你能检查粘贴列的输出到我发布的那个吗?
      • @runningbirds 它确实适用于值向量。更新了帖子。
      • 谢谢你我真的很感激你的帮助。这将为我节省大量的错别字调试
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多