R对多列的组合进行分组
R grouping over combination of multiple columns
将输入 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")
我试图对 a
和 c
进行分组并汇总 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 相同?
p.s。由于用于分组的列数量众多,我不希望将它们连接在一起。
谢谢。
我们需要.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'
将输入 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")
我试图对 a
和 c
进行分组并汇总 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 相同?
p.s。由于用于分组的列数量众多,我不希望将它们连接在一起。 谢谢。
我们需要.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'