2015-05-04 55 views
21

我有一個包含22000行和25列的大型數據集。我試圖根據其中一列對我的數據集進行分組,並根據分組數據集獲取另一列的最小值。然而,問題在於它只給出了兩列包含分組列和具有最小值的列......但我需要與具有最小值的行相關的其他列的所有信息。 下面是一個簡單的例子,只是爲了讓重複性:應用group_by並彙總數據,同時保留所有列的信息

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 

所以,我也需要有相關的d一列和信息,但是,因爲我已經在列c我不能合併的值複製他們基於min_value列...我想知道是否有任何方法來保留其他列的信息,當我們使用dplyr包。

我在這裏找到了一些解釋「dplyr: group_by, subset and summarise」和這裏「Finding percentage in a sub-group using group_by and summarise」但沒有地址我的問題。

+0

究竟你打算如何產生的data.frame會看?其他數據在壓縮爲單行時會如何查看? – r2evans

回答

20

下面是使用)filter兩個選項和b)slice從dplyr。在這種情況下,對於任何組,在列c中沒有重複的最小值,因此a)和b)的結果是相同的。如果重複的最小值,則方法a)將返回每個組的每個最小值,而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 

或類似地

> 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 
+1

感謝百萬Docendo的答案。這正是我所期待的:-) –

+0

正是我需要的!我發現功能片作爲獎勵,thx! – Adi

18

您可以使用group_bysummarize

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

非常感謝Bergant,事情就是你的方法給了我所有的行......但是重要的是我知道例如min值與col「a」中的數字4相關。 Docendo的答案正是我所需要的。無論如何感謝您的回答:-) –

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 
相關問題