应用 group_by 并汇总数据,同时保留所有列的信息

Posted

技术标签:

【中文标题】应用 group_by 并汇总数据,同时保留所有列的信息【英文标题】:Applying group_by and summarise on data while keeping all the columns' info 【发布时间】:2015-07-13 12:03:57 【问题描述】:

我有一个包含 22000 行和 25 列的大型数据集。我正在尝试根据其中一列对我的数据集进行分组,并根据分组数据集获取另一列的最小值。但是,问题是它只给了我两列包含分组列和具有最小值的列......但是我需要与具有最小值的行相关的其他列的所有信息。 这是一个简单的示例,只是为了使其可重现:

    data<- data.frame(a=1:10, b=c("a","a","a","b","b","c","c","d","d","d"), c=c(1.2, 2.2, 2.4, 1.7, 2.7, 3.1, 3.2, 4.2, 3.3, 2.2), d= c("small", "med", "larg", "larg", "larg", "med", "small", "small", "small", "med"))

    d<- data %>%
    group_by(b) %>%
    summarise(min_values= min(c))
    d
    b min_values
    1 a        1.2
    2 b        1.7
    3 c        3.1
    4 d        2.2

因此,我还需要与列 a 和 d 相关的信息,但是,由于 c 列中的值有重复项,因此我无法根据 min_value 列合并它们...我想知道是否有任何使用 dplyr 包时保留其他列信息的方法。

我在这里“dplyr: group_by, subset and summarise”和“Finding percentage in a sub-group using group_by and summarise”找到了一些解释,但没有一个能解决我的问题。

【问题讨论】:

您究竟如何建议生成的 data.frame 的外观?压缩成单行后其他数据的外观如何? 【参考方案1】:

使用sqldf

library(sqldf)
 # Two options:
sqldf('SELECT * FROM data GROUP BY b HAVING min(c)')
sqldf('SELECT a, b, min(c) min, d FROM data GROUP BY b')

输出:

   a b   c     d
1  1 a 1.2 small
2  4 b 1.7  larg
3  6 c 3.1   med
4 10 d 2.2   med

【讨论】:

【参考方案2】:

这里有两个选项,使用来自 dplyr 的 a) filter 和 b) slice。在这种情况下,对于任何组,c 列中没有重复的最小值,因此 a) 和 b) 的结果是相同的。如果存在 重复的最小值,则方法 a) 将返回每组的每个最小值,而 b) 将仅返回每组中的一个最小值(第一个)。

a)

> data %>% group_by(b) %>% filter(c == min(c))
#Source: local data frame [4 x 4]
#Groups: b
#
#   a b   c     d
#1  1 a 1.2 small
#2  4 b 1.7  larg
#3  6 c 3.1   med
#4 10 d 2.2   med

或者类似

> data %>% group_by(b) %>% filter(min_rank(c) == 1L)
#Source: local data frame [4 x 4]
#Groups: b
#
#   a b   c     d
#1  1 a 1.2 small
#2  4 b 1.7  larg
#3  6 c 3.1   med
#4 10 d 2.2   med

b)

> data %>% group_by(b) %>% slice(which.min(c))
#Source: local data frame [4 x 4]
#Groups: b
#
#   a b   c     d
#1  1 a 1.2 small
#2  4 b 1.7  larg
#3  6 c 3.1   med
#4 10 d 2.2   med

【讨论】:

感谢一百万 Docendo 的回答。这正是我想要的:-) 正是我需要的!我发现了函数 slice 作为奖励,谢谢! 如果您尝试使用汇总来获取原始数据中未包含的信息,因此无法“过滤”怎么办?例如,求和还是均值? 派对迟到了,但您仍然可以通过函数返回进行过滤。例如,您可以使用df %&gt;% group_by(x) %&gt;% filter(n() &gt; 10) 过滤具有十个以上观察值的组,而无需将n() 分配给任何先前的列。【参考方案3】:

你可以使用group_by而不使用summarize

data %>%
  group_by(b) %>%
  mutate(min_values = min(c)) %>%
  ungroup()

【讨论】:

非常感谢Bergant,问题是你的方法给了我所有的行......但重要的是我知道例如最小值与col中的数字4有关“一种”。 Docendo 下面的回答正是我所需要的。无论如何感谢您花时间回答这个问题:-) 这个答案。我一周中的“duh”时刻。 如此简单,却又如此强大。

以上是关于应用 group_by 并汇总数据,同时保留所有列的信息的主要内容,如果未能解决你的问题,请参考以下文章

在一列上汇总数据框,同时保留其他列

是否可以 unlist() 嵌套数据框,同时保留 data.frame 中的其他列?

Group_by / 按函数内的两个变量汇总

当存在缺失值时,将汇总与多个函数一起使用

R:dplyr 有条件地汇总并重新编码列中的值

R dplyr如何通过列号而不是通过汇总的列名选择变量