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

时间:2015-05-04 07:08:43

标签: r dplyr

我有一个包含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”,但没有解决我的问题。

3 个答案:

答案 0 :(得分:36)

以下两个选项使用a)来自dplyr的it('should go to 3d party service when i click "auth" button' , function() { element(by.id('files-services-icon')).click(); element(by.id('box-vendor-menu-item')).click(); browser.ignoreSynchronization = true; expect(browser.getCurrentUrl()).toContain('https://app.box.com/api/oauth2/authorize'); browser.ignoreSynchronization = false; }); 和b)filter。在这种情况下,对于任何组,列slice中没有重复的最小值,因此a)和b)的结果是相同的。如果重复的最小值,则方法a)将返回每个组的每个最小值,而b)将仅返回每个组中的一个最小值(第一个)。

<强> A)

c

或类似地

> 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

<强> b)中

> 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

答案 1 :(得分:32)

您可以使用group_by而不summarize

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

答案 2 :(得分:2)

使用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