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

Mom*_*tan 48 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
Run Code Online (Sandbox Code Playgroud)

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

我在这里找到了一些解释" dplyr:group_by,subset and summarize ",这里" 使用group_by查找子组中的百分比并汇总 ",但没有一个地址是我的问题.

tal*_*lat 39

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

一个)

> 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
Run Code Online (Sandbox Code Playgroud)

或者类似的

> 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 如果您尝试使用汇总来获取原始数据中未包含的信息,因此无法“过滤”,该怎么办?例如,总和或平均值? (3认同)
  • 感谢百万 Docendo 的回答。这正是我要找的:-) (2认同)

ber*_*ant 35

你可以group_by不用summarize:

data %>%
  group_by(b) %>%
  mutate(min_values = min(c)) %>%
  ungroup()
Run Code Online (Sandbox Code Playgroud)

  • 这个答案。我本周的“呃”时刻。 (3认同)
  • 非常感谢 Bergant,问题是你的方法给了我所有的行......但对我来说知道例如最小值与列“a”中的数字 4 相关很重要。Docendo 在下面的回答正是我所需要的。无论如何,感谢您花时间回答这个问题:-) (2认同)
  • “ungroup()”应替换为 slice(1),这会将行数减少到每组一个,并且还可以使用多个摘要列 (2认同)