2016-03-25 2 views
0

ist Entschuldigung im Voraus, wenn dies bereits gefragt wurde ... Ich fand es schwierig, die Frage zu stellen, nur um hier zu fragen, geschweige denn zu suchen!Erstellen Sie einen neuen Zeileneintrag, der die Summe ausgewählter Zeilen in R

Dies ist ein kleiner Beispiel für die Art der Daten, mit denen ich arbeite:

> df <- data.frame("ID"=c("A1","A1","A1","A1","A2","A2","A2","A3","A3","A3","A3"), 
      "Cat"=c("corn","wheat","quarry","barley","corn","wheat","lake","corn","wheat","quarry","rye"), 
      "Count"=c(3,1,3,4,5,2,4,7,2,9,1)) 

> df 
    ID Cat Count 
1 A1 corn  3 
2 A1 wheat  1 
3 A1 quarry  3 
4 A1 barley  4 
5 A2 corn  5 
6 A2 wheat  2 
7 A2 lake  4 
8 A3 corn  7 
9 A3 wheat  2 
10 A3 quarry  9 
11 A3 rye  1 

Ich habe mehrere hundert verschiedene IDs, von denen jede eine Anzahl Eintragstypen für etwa zwei Dutzend verschiedener Kategorie haben. Nicht jede ID hat einen Eintrag für jede Kategorie. Ich möchte einen neuen Kategorietyp erstellen, der für jede eindeutige ID eine Auswahl anderer Kategorien zusammenfasst. Zum Beispiel würde dies die Ausgabe des obigen Datum sein:

ID Cat Count 
1 A1 crops  8 
2 A1 quarry  3 
3 A2 crops  7 
4 A2 lake  4 
5 A3 crops 10 
6 A3 quarry  9 

... wenn ich hinzufügen zusammen Mais will, Weizen, Gerste, Roggen und in eine neue Kategorie, „Kulturen“, aber ausschließt Steinbruch und See.

Ich habe erfolgreich "Aggregat" verwendet, um diesen Datenrahmen an erster Stelle zu erzeugen, aber ich war nicht in der Lage, eine Möglichkeit zu finden, eine völlig neue Zeile durch die Summierung mehrerer Zeilen, alle in einem ID-Nummer.

Danke für jede Eingabe!

+0

Können Sie die Ausgabe der letzten Zeile überprüfen? – akrun

+0

ja, guter Fang – Victoria

+0

Ich postete unten zwei Lösungen. Wenn es funktioniert, denken Sie bitte daran, die Lösung zu akzeptieren, indem Sie auf das Häkchen neben der Abstimmung klicken – akrun

Antwort

2

Wir können data.table verwenden. Konvertieren Sie den 'data.frame' in 'data.table' (setDT(df)). Ordne die "Katze" den "Ernten" für Elemente zu, die nicht "Steinbruch" oder "See" sind, dann gruppiert nach "Katze" und "ID", erhalten wir die sum von "Count".

library(data.table) 
setDT(df)[!(Cat %chin% c("quarry", "lake")), Cat := "crops"] 
df[, .(Count=sum(Count)),.(ID, Cat)] 
# ID Cat Count 
#1: A1 crops  8 
#2: A1 quarry  3 
#3: A2 crops  7 
#4: A2 lake  4 
#5: A3 crops 10 
#6: A3 quarry  9 

Oder mit base R wir den Datensatz durch replace ing die Elemente transform, die nicht „Steinbruch“ oder „See“ mit „Kulturen“, und dann aggregate die sum von „Count“ zu bekommen gruppiert von "Katze" und "ID".

df1 <- transform(df, Cat = replace(as.character(Cat), 
     !(Cat %in% c("quarry", "lake")), "crops")) 
aggregate(Count~., df1, sum) 
Verwandte Themen