2016-04-29 1 views
0

Ich habe einen Datenrahmen, wo Zeilen dupliziert werden. Ich muss daraus eindeutige Zeilen erstellen. Ich habe versucht, ein paar Optionen, aber sie scheinen nichtSo erstellen Sie eindeutige Zeilen in einem Datenrahmen

Dies funktioniert für einige Zeilen zu arbeiten, sondern gibt auch den Fehler „Erwartung einen einzelnen Wert“. Der Datenrahmen ‚l‘ sieht wie folgt aus

 bowler overs maidens runs wickets economyRate  date opposition 
    (fctr) (int) (int) (dbl) (dbl)  (dbl)  (date)  (chr) 
1 MA Starc  9  0 51  0  5.67 2010-10-20  India 
2 MA Starc  9  0 27  4  3.00 2010-11-07 Sri Lanka 
3 MA Starc  9  0 27  4  3.00 2010-11-07 Sri Lanka 
4 MA Starc  9  0 27  4  3.00 2010-11-07 Sri Lanka 
5 MA Starc  9  0 27  4  3.00 2010-11-07 Sri Lanka 
6 MA Starc  6  0 33  2  5.50 2012-02-05  India 
7 MA Starc  6  0 33  2  5.50 2012-02-05  India 
8 MA Starc 10  0 50  2  5.00 2012-02-10 Sri Lanka 
9 MA Starc 10  0 50  2  5.00 2012-02-10 Sri Lanka 
10 MA Starc  8  0 49  0  6.12 2012-02-12  India 

Das Datum einzigartig ist und verwendet werden kann, um die Zeilen zu erhalten, für die die Zeile ausgewählt werden kann. Bitte lassen Sie mich wissen, wie das geht.

+0

Dies ist, weil 'summarise' einen einzelnen Wert für jede Kombination der Gruppen zurückgibt. Wenn mehrere eindeutige Datumsangaben in einer Kombination vorhanden sind, führt dies zu einem Ungleichgewicht. Es ist besser, die Ausgabe von Beispieldaten und erwarteten Ausgaben zu veröffentlichen. – akrun

+0

Die dplyr Autoren erwägen, eine Erweiterung zu machen, um dies zu unterstützen (worüber akrun sprach), sieht so aus: https://github.com/hadley/dplyr/issues/154 – Frank

+0

Bitte, können Sie den Code zum Erstellen des Beispiels bereitstellen data.frame mit Ihrer Frage? Dies ermöglicht es, die Richtigkeit der Antworten zu testen, ohne das Poster zu belasten, um Ihre Daten neu zu erstellen. - Vielen Dank – Uwe

Antwort

1

Im Beispieldatensatz gibt es mehr als eine unique Elemente von "Datum" für jede "Bowler", "Wickets" -Kombination. Eine Möglichkeit wäre, paste die unique 'date' zusammen

l %>% 
    group_by(bowler, wickets) %>% 
    summarise(economyRate= mean(economyRate), d = toString(unique(date))) 

Oder erstellen Sie 'd' als list Spalte

l %>% 
    group_by(bowler, wickets) %>% 
    summarise(economyRate= mean(economyRate), d = list(unique(date))) 

Im Hinblick auf 'economyRate', ich bin zu raten, die OP müssen die mean davon.

Wenn wir eine Spalte von unique Datum in den ursprünglichen Daten-Set erstellen müssen, verwenden mutate

l %>% 
    group_by(bowler, wickets) %>% 
    mutate(d = list(unique(date))) 

Da die OP nicht die erwartete Ausgabe vorsah, konnte die unten sein auch das Ergebnis

l %>% 
    group_by(bowler, wickets) %>% 
    distinct(date) 

Oder wie @Frank

l %>% 
    group_by(bowler,wickets,date) %>% 
    slice(1L) 
+0

Danke @akrun! Das war, was ich wollte. Ich habe schließlich mit dem folgenden Code l1 <- l %>% group_by (Bowler, Pforten, economyRate)%>% distinct (Datum) –

0

so erwähnt, habe ich eine ungewöhnlicher Weg, diese Dissektion zu machen, aber ich ließ das Datum ein Faktor bleiben, als es aus der csv-Datei kam, die ich erstellte. Sie könnte die Datumsspalte auf einen Faktor mit

l1$date<-as.factor(l1$date) 

Dies wird diese Zeile machen eine nicht aktuelle Zeile, können Sie auch zum Charakter umwandeln könnte leicht, entweder gut funktionieren. So sieht es strukturell aus.

str(l1) 
'data.frame': 10 obs. of 10 variables: 
$ bowler  : Factor w/ 2 levels "(fctr)","MA": 2 2 2 2 2 2 2 2 2 2 
$ overs  : Factor w/ 2 levels "(int)","Starc": 2 2 2 2 2 2 2 2 2 2 
$ maidens : Factor w/ 5 levels "(int)","10","6",..: 5 5 5 5 5 3 3 2 2 4 
$ runs  : Factor w/ 2 levels "(dbl)","0": 2 2 2 2 2 2 2 2 2 2 
$ wickets : Factor w/ 6 levels "(dbl)","27","33",..: 6 2 2 2 2 3 3 5 5 4 
$ economyRate: Factor w/ 4 levels "(dbl)","0","2",..: 2 4 4 4 4 3 3 3 3 2 
$ date  : Factor w/ 6 levels "(date)","3","5",..: 5 2 2 2 2 4 4 3 3 6 
$ opposition : Factor w/ 6 levels "(chr)","10/20/2010",..: 2 3 3 3 3 6 6 4 4 5 
$ X.1  : Factor w/ 3 levels "","India","Sri": 2 3 3 3 3 2 2 3 3 2 
$ X.2  : Factor w/ 2 levels "","Lanka": 1 2 2 2 2 1 1 2 2 1 

Danach geht es darum, sicherzustellen, dass Sie die Untereinstellungen Grammatik verwenden richtig mit der knappste Abfrage:

l2<-l1[!duplicated(l1$date),] 

Und das ist, was zurückgegeben wird, 5 Reihen von eindeutigen Daten:

bowler overs maidens runs wickets economyRate date opposition X.1 X.2 
2  MA Starc  9 0  51   0 5.67 10/20/2010 India  
3  MA Starc  9 0  27   4 3 11/7/2010 Sri Lanka 
7  MA Starc  6 0  33   2 5.5 2/5/2012 India  
9  MA Starc  10 0  50   2 5 2/10/2012 Sri Lanka 
11  MA Starc  8 0  49   0 6.12 2/12/2012 India 

Das einzige, was Sie vorsichtig sein müssen, ist, dass nach dem Komma !duplicated(l1$date) zu halten sicher sein, dass alle Spalten werden gesucht und in der letzten Teilmenge enthalten.

Wenn Sie Daten oder Zeichen möchten, können Sie as.POSIXct oder as.character konvertieren sie in ein verwendbares Format für den Rest Ihrer Manipulation.

Ich hoffe, das ist nützlich für Sie!

1

Wenn ich die Absicht des OP richtig mache, bittet er darum, die doppelten Zeilen einfach zu entfernen. Also, ich würde

unique(l1) 

verwenden Das ist, was ?unique sagt:

einzigartige liefert einen Vektor, Datenrahmen oder Array wie x, aber mit doppelten Elemente/Zeilen entfernt.

+0

Verwenden Sie 'dplyr :: distinct', um nur ähnliche Zeilen zu halten. Aber es wird hier nicht funktionieren. –

+0

@PaulRougieux Was ist der Vorteil der Verwendung von 'dplyr' gegenüber der Basisfunktion' unique'? – Uwe

+0

Siehe "distinct", Sie können "Variablen angeben, die bei der Bestimmung der Eindeutigkeit verwendet werden sollen". Zum Beispiel ist 'a <- data.frame (i = c (1,1,3), j = c (1,1,1))', 'distinct (a)' ist das gleiche wie 'unique (a)' , aber du kannst auch 'distinct (a, j)', 'distinct (a, i)' machen. Plus distinct ist ähnlich der Terminologie der SQL-Datenbank. –

1

Daten

l <- read.table(text = "bowler overs maidens runs wickets economyRate date opposition 
1 MA_Starc 9 0 51 0 5.67 2010-10-20 India 
2 MA_Starc 9 0 27 4 3.00 2010-11-07 Sri-Lanka 
3 MA_Starc 9 0 27 4 3.00 2010-11-07 Sri-Lanka 
4 MA_Starc 9 0 27 4 3.00 2010-11-07 Sri-Lanka 
5 MA_Starc 9 0 27 4 3.00 2010-11-07 Sri-Lanka 
6 MA_Starc 6 0 33 2 5.50 2012-02-05 India 
7 MA_Starc 6 0 33 2 5.50 2012-02-05 India 
8 MA_Starc 10 0 50 2 5.00 2012-02-10 Sri-Lanka 
9 MA_Starc 10 0 50 2 5.00 2012-02-10 Sri-Lanka 
10 MA_Starc 8 0 49 0 6.12 2012-02-12 India") 

Distinct

Verwenden dplyr :: verschiedene duplizierten Zeilen zu entfernen.

ldistinct <- distinct(l) 
#  bowler overs maidens runs wickets economyRate  date 
# 1 MA_Starc  9  0 51  0  5.67 2010-10-20 
# 2 MA_Starc  9  0 27  4  3.00 2010-11-07 
# 3 MA_Starc  6  0 33  2  5.50 2012-02-05 
# 4 MA_Starc 10  0 50  2  5.00 2012-02-10 
# 5 MA_Starc  8  0 49  0  6.12 2012-02-12 
# opposition 
# 1  India 
# 2 Sri-Lanka 
# 3  India 
# 4 Sri-Lanka 
# 5  India 
l2 <- summarise(group_by(ldistinct,bowler,wickets), 
       economyRate,d=unique(date)) 
# Error: expecting a single value 

Aber es ist hier nicht genug, gibt es noch viele Termine für eine Kombination von Melone und Wickets.

Collapse Werte zusammen

Durch mehrere Werte zusammen einfügen, werden Sie sehen, dass es viele Termine sind und viele economyRate für eine einzige Kombination von Melone und Wickets.

l3 <- summarise(group_by(l,bowler,wickets), 
       economyRate = paste(unique(economyRate),collapse=", "), 
       d=paste(unique(date),collapse=", ")) 
l3 

#  bowler wickets economyRate      d 
#  (fctr) (int)  (chr)     (chr) 
# 1 MA_Starc  0 5.67, 6.12 2010-10-20, 2012-02-12 
# 2 MA_Starc  2  5.5, 5 2012-02-05, 2012-02-10 
# 3 MA_Starc  4   3    2010-11-07