在dplyr中为groupby连接R中没有引号的单词

时间:2016-04-16 04:36:23

标签: r group-by concatenation dplyr

我的数据集涉及大量列连接(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())

2 个答案:

答案 0 :(得分:1)

如果有很多列,我们可以直接对列名称进行分组,指定要分组的列。在这种情况下,请使用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提到它没有进行分组,我们可以通过unite'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

答案 1 :(得分: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