2015-05-04 6 views
21

Ich habe einen großen Datensatz mit 22000 Zeilen und 25 Spalten. Ich versuche, meinen Datensatz basierend auf einer der Spalten zu gruppieren und den minimalen Wert der anderen Spalte basierend auf dem gruppierten Datensatz zu ermitteln. Das Problem ist jedoch, dass es mir nur zwei Spalten gibt, die die gruppierte Spalte und die Spalte mit dem Min-Wert enthalten ... aber ich benötige alle Informationen anderer Spalten, die sich auf die Zeilen mit den Min-Werten beziehen. Hier ist ein einfaches Beispiel nur um es reproduzierbar:Anwenden von group_by und Zusammenfassen von Daten unter Beibehaltung aller Spalten Info

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 

Also, ich brauche auch Spalten, die Informationen haben im Zusammenhang a und d, aber da ich Doppelungen in den Werten in Spalte c haben kann ich nicht fusionieren Sie basieren auf der Spalte min_value ... Ich habe mich gefragt, ob es möglich ist, die Informationen anderer Spalten beizubehalten, wenn wir das dplyr-Paket verwenden.

Ich habe hier eine Erklärung gefunden "dplyr: group_by, subset and summarise" und hier "Finding percentage in a sub-group using group_by and summarise" aber keine der Adressen mein Problem.

+0

Wie genau wollen Sie das resultierende data.frame aussehen würde? Wie würden die anderen Daten aussehen, wenn sie in einer einzigen Zeile komprimiert sind? – r2evans

Antwort

20

Hier sind zwei Möglichkeiten: a) filter verwenden und b) slice von dplyr. In diesem Fall gibt es keine doppelten Mindestwerte in der Spalte c für irgendeine der Gruppen, und daher sind die Ergebnisse von a) und b) dieselben. Wenn doppelte Minima wären, würde Ansatz a) jedes Minima pro Gruppe zurückgeben, während b) nur ein Minimum (das erste) in jeder Gruppe zurückgeben würde.

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 

oder auf ähnliche Weise

> 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

Danke eine Million Docendo für die Antwort. Genau das habe ich gesucht :-) –

+0

Genau das, was ich brauchte! Und ich entdeckte die Funktion Slice als Bonus, thx! – Adi

18

Sie können group_by ohne summarize verwenden:

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

Vielen Dank Bergant, die Sache ist, dass Ihre Methode gibt mir alle Zeilen ... aber es ist wichtig für mich zu wissen, zum Beispiel der Min-Wert ist mit der Zahl 4 in Spalte "a" verwandt. Die folgende Antwort von Docendo ist genau das, was ich brauchte. Danke trotzdem für deine Zeit auf diese Antwort :-) –

2

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

Ausgang:

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 
Verwandte Themen