【问题标题】:R grouping over combination of multiple columns [duplicate]R对多列组合的分组[重复]
【发布时间】:2016-11-18 10:50:51
【问题描述】:

将输入 dsam 视为:

structure(list(a = structure(c(3L, 2L, 1L, 3L, 1L, 3L, 1L, 1L, 1L, 1L), 
.Label = c("A", "B", "C"), class = "factor"), b = c(1, 
1, 1, 1, 1, 3, 2, 3, 3, 1), c = structure(c(2L, 1L, 1L, 2L, 1L, 
3L, 1L, 1L, 3L, 3L), .Label = c("D", "E", "F"), class = "factor")), 
.Names = c("a", "b", "c"), row.names = c(NA, -10L), class = "data.frame")

我试图将ac 分组并聚合b 以使每个组保持一条记录。但似乎以下代码的行为有所不同。 原始数据有超过 300 列用于分组,因此不能显式指定列名,因此不能使用列名列表进行分组。

方法一:

dsam %>% 
  group_by(a,c) %>% 
  mutate(rnk = row_number(), b = sum(b)) %>% 
  filter( rnk == max(rnk)) %>% print()

#Source: local data frame [5 x 4]
#Groups: a, c [5]
#
#       a     b      c   rnk
#  <fctr> <dbl> <fctr> <int>
#1      B     1      D     1
#2      C     2      E     2
#3      C     3      F     1
#4      A     7      D     4
#5      A     4      F     2

方法二:

dsam %>% 
  group_by_(unlist(c("a","c"))) %>% 
  mutate(rnk = row_number(), b = sum(b)) %>% 
  filter( rnk == max(rnk)) %>% print()


#Source: local data frame [3 x 4]
#Groups: a [3]
#
#       a     b      c   rnk
#  <fctr> <dbl> <fctr> <int>
#1      B     1      D     1
#2      C     5      F     3
#3      A    11      F     6

如何使方法 2 的行为与方法 1 相同?

附言由于用于分组的列数量众多,我不希望将它们连接在一起。 谢谢。

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    我们需要.dots

    dsam %>% 
         group_by_(.dots = c("a", "c")) %>%
         mutate(rnk = row_number(), b = sum(b)) %>% 
         filter( rnk == max(rnk))
    #      a     b      c   rnk
    #  <fctr> <dbl> <fctr> <int>
    #1      B     1      D     1
    #2      C     2      E     2
    #3      C     3      F     1
    #4      A     7      D     4
    #5      A     4      F     2
    

    如果我们不使用.dots,它将仅按第一列分组,即'a'

    【讨论】:

    • 啊,我真是个白痴。谢谢!这样一来,我什至不需要unlist
    猜你喜欢
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多