2010-05-03 10 views
12

Ich habe einen großen Datenrahmen mit Säulen wie:Sie sich von Zeilen mit doppelten Attributen in R befreite

ID, time, OS, IP 

Jede Zeile dieses Datenrahmen zu einem Eintrag entspricht. Innerhalb dieses Datenrahmens existieren für einige IDs mehrere Einträge (Zeilen). Ich möchte diese mehreren Zeilen loswerden (offensichtlich werden die anderen Attribute für die gleiche ID abweichen). Oder anders: Ich möchte nur einen einzigen Eintrag (Zeile) für jede ID.

Wenn ich unique für die Spalte ID verwende, erhalte ich nur die Ebenen (oder jede eindeutige ID), aber ich möchte auch die anderen Attribute behalten. Ich habe versucht, apply(x,2,unique(data$ID)) zu verwenden, aber das funktioniert auch nicht.

+1

Sie müssen definieren, was wollen Sie mit den anderen Attributen für Beobachtungen mit der gleichen ID zu tun wenn die nicht zustimmen. – Aniko

+0

Nun, ich würde gerne die OS-Distribution der Benutzer sehen ... Also wenn ich den Datenrahmen mit nur einem Eintrag pro Benutzer habe, mache ich: mytable <- table (Datensatz $ os.name) und mache danach ein Plotten ... – CatholicEvangelist

Antwort

26
subset(data,!duplicated(data$ID)) 

den Trick Sollte

+0

vielen Dank - ich war dabei zu verzweifeln ... – CatholicEvangelist

+0

Dies funktioniert, wenn Sie keine Heuristik für die Auswahl der anderen Daten haben. Scheint wie ein sehr seltsamer Anwendungsfall für mich ... – Shane

+1

Genau das, was ich gerade gebraucht habe James, danke. –

3

Wenn Sie für jede ID eine Zeile halten wollen, aber es gibt unterschiedliche Daten in jeder Zeile, dann müssen Sie auf einige Logik entscheiden, die zusätzlichen Zeilen zu verwerfen. Zum Beispiel:

df <- data.frame(ID=c(1, 2, 2, 3), time=1:4, OS="Linux") 
df 
    ID time OS 
1 1 1 Linux 
2 2 2 Linux 
3 2 3 Linux 
4 3 4 Linux 

Jetzt werde ich die maximale Zeit Wert halten und die letzte OS Wert:

library(plyr) 
unique(ddply(df, .(ID), function(x) data.frame(ID=x[,"ID"], time=max(x$time), OS=tail(x$OS,1)))) 
    ID time OS 
1 1 1 Linux 
2 2 3 Linux 
4 3 4 Linux 
+0

vielen dank für die detaillierte antwort !!! – CatholicEvangelist

Verwandte Themen