应用group#U by并汇总数据,同时保留所有列';信息

应用group#U by并汇总数据,同时保留所有列';信息,r,dplyr,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.

我有一个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
数据%
总结(最小值=最小值(c))
D
b最小值
1 a 1.2
2 b 1.7
3 c 3.1
4 d 2.2
因此,我还需要与a列和d列相关的信息,但是,由于c列中的值存在重复,因此我无法基于min_值列合并它们。。。我想知道当我们使用dplyr包时,是否有任何方法可以保存其他专栏的信息


我在这里和这里找到了一些解释,但没有一个能解决我的问题。

您可以使用
group\u by
而不使用
summary

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

这里有两个选项,分别使用dplyr中的a)
过滤器和b)
切片。在这种情况下,任何组的
c
列中都没有重复的最小值,因此a)和b)的结果相同。如果存在重复的最小值,方法a)将在每组中返回每个最小值,而b)在每组中只返回一个最小值(第一个)

a)

或者类似地

> 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)


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

您究竟建议生成的data.frame的外观如何?其他数据压缩成一行时会是什么样子?非常感谢Bergant,问题是你的方法给了我所有的行。。。但对我来说,重要的是要知道,例如,最小值与列“a”中的数字4有关。Docendo下面的答案正是我所需要的。无论如何,谢谢你花时间回答这个问题:-)这个答案。本周我的“duh”时刻。如此简单,却又如此强大。感谢一百万Docendo的回答。这正是我想要的:-)正是我需要的!我发现函数片是一种奖励,thx!如果您试图使用Summary获取原始数据中不包含的信息,因此无法“过滤”,该怎么办?例如,总和还是平均数?
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