2016-05-19 12 views
0

Ich muss Aggregatreihen eines Datenrahmens mit vielen Reihen in dieser Weise:Wie wird die Priorität beim Zusammenfassen von Zeilen eines Datenrahmens festgelegt?

Nehmen wir I zwei Reihen, die ich zusammenführen sollen (da sie die gleichen ersten Element haben):

x1=c(ID1,1,3,2,1,NA); 
    x2=c(ID1,2,2,3,NA,NA); 

Ich möchte ihre Werte so zusammenführen, dass das Ergebnis im Falle eines Konflikts (clash = beide Zeilen haben einen Nicht-NA-Wert im Element) den Wert in einer Zeile mit höherem Wert im zweiten Element (das ist x2) bevorzugt.

So im Beispiel das Ergebnis der Aggregation dieser insbesondere zwei Reihen sind:

x12=c(ID1,2,2,3,1,NA) 

Kann jemand bitte helfen? Ich versuchte aggregate(), aber es bietet nur zusammenfassende Statistiken wie Mittelwert, max usw.

+0

Kann es mehr als 1 ID1 an einem Datenrahmen geben oder ist es einzigartig? Können Sie eine Stichprobe der Daten (die 2 Datenrahmen) geben? Es ist nicht klar, ob eine Funktion x1 und x2 als Eingabe und Ausgabe x12 oder eine Lösung für beide Datenfelder erhalten soll. –

+0

Bitte geben Sie Beispieldaten an, die darstellen, was Sie tun möchten. Sie sagen, Sie möchten zwei data.frames nach Zeilen zusammenführen, haben aber nur zwei Vektoren bereitgestellt. Tipps zur Erstellung eines Mindestbeispiels (http://stackoverflow.com/help/mcve) sowie zur Erstellung von [examples in R] finden Sie im folgenden Artikel (http://stackoverflow.com/questions/5963269/how- um ein großartiges r-reproduzierbares Beispiel zu erstellen. – lmo

Antwort

1

Sie max als Funktion für die aggregate Funktion nutzen zu können.

Daten:

x1=c('ID1',1,2,1,NA) 
x2=c('ID1',3,3,NA,NA) 

data <- data.frame(rbind(x1, x2), stringsAsFactors = FALSE) 

Aggregieren:

aggregate(data[,2:5], by = list(name = data$X1), FUN = max, na.rm = TRUE) 

Ergebnis:

name X2 X3 X4 X5 
1 ID1 3 3 1 <NA> 
+0

Ich möchte nach der Regel zusammenführen "wenn es einen Nicht-NA-Wert im x2 Vektor gibt, dann behalte diesen Wert. Ansonsten behalte den Wert von x1". das heißt mit den Eingaben: 'x1 = c (' ID1 ', 3,2,1, NA) x2 = c (' ID1 ', 2,3, NA, NA)' die Ausgabe wird 'x12 = c (ID1,2,3,1, NA) (mein realer Datensatz ist natürlich viel größer als das). –

+0

Bitte beachten Sie den Kommentar von @lmo zuerst und bitte bearbeiten Sie Ihre ursprüngliche Frage, um zu reflektieren, nach was Sie suchen. – elevendollar

0

Sie können sqldf SQL über das Paket.

Mit sql Sie können group by ID und select die max der Werte, die Sie erwähnt.

require(data.table) 
require(sqldf) 
x1 <- c(1,1,2,1,NA) 
x2 <- c(1,3,3,NA,NA) 
x <- data.table(rbind(x1,x2)) 
colnames(x) <- c("ID", "x1", "x2", "x3", "x4") 

sqldf("select ID, max(x1) as x1, max(x2) as x2, max(x3) as x3, max(x4) as x4 from x group by ID") 

    ID x1 x2 x3 x4 
1 1 3 3 1 NA