2016-06-30 17 views
2

Ich möchte einen einzelnen Datenrahmen aus der Liste der Datenrahmen, in denen alle Spalten identisch sind mit Ausnahme einer Spalte "Einkommen", die Summe der alle Einnahmen in der Liste sein soll.Summe der Spalten in einer Liste von Datenrahmen

Hier ist meine Liste von Datenrahmen

mylist= structure(list(`1` = structure(list(ID = c(36L, 37L, 38L, 39L), Income = c(0, 0, 0, 9100)), .Names = c("ID", "Income"), row.names = c(1L, 2L, 3L, 4L), class = "data.frame"), `2` = structure(list(ID = c(36L, 37L, 38L, 39L), Income = c(0, 0, 0, 0)), .Names = c("ID", "Income"), row.names = c(1L, 2L, 3L, 4L), class = "data.frame"), `3` = structure(list(ID = c(36L, 37L, 38L, 39L), Income = c(7360, 0, 0, 0)), .Names = c("ID", "Income"), row.names = c(1L, 2L, 3L, 4L), class = "data.frame"))) 

> mylist 
$`1` 
    ID Income 
1 36  0 
2 37  0 
3 38  0 
4 39 9100 

$`2` 
    ID Income 
1 36  0 
2 37  0 
3 38  0 
4 39  0 

$`3` 
    ID Income 
1 36 7360 
2 37  0 
3 38  0 
4 39  0 

Dies ist, was ich tun möchte:

ID Income 
34 36  7360 
26 37  0 
23 38  0 
15 39  9100 

I() zu verwenden, haben versucht, zu reduzieren, um die Summe zu tun, aber es schafft eine separate Spalte was ich vermeiden wollen:

Reduce(function(df1, df2) data.frame(df1[,], res=df1["Income"] + df2["Income"]),mylist) 

Antwort

3

Wenn die ‚IDs in verschiedenen list verschieden sein können, wir merge die Datensätze mit Reduce, und dann die rowSums der Ausgabe mit Ausnahme der ersten, um die Spalte "Income" zu erstellen.

r1 <- Reduce(function(...) merge(..., by = "ID"), mylist) 
data.frame(r1[1], Income = rowSums(r1[-1])) 
# ID Income 
#1 36 7360 
#2 37  0 
#3 38  0 
#4 39 9100 

Wenn die ‚IDs‘ gleich und in der gleichen Reihenfolge für alle Datensätze in der list schaffen wir die data.frame durch die ‚ID‘ Extrahieren von dem ersten Element von ‚mylist‘ und Holen Sie sich die Summe des "Income" unter Verwendung von Reduce mit +.

data.frame(mylist[[1]][1], Reduce(`+`, lapply(mylist, `[`, 'Income'))) 
+0

Danke für beide Lösungen. Ich versuche nur herauszufinden, wie es funktioniert. –

+0

@AndroidBeginner In der ersten Lösung werden wir nach 'ID' verschmelzen, um ein einzelnes Dataset zu erstellen und dann die 'rowSums' der Spalten von 2: ncol (r1). Für die zweite Lösung ist die 'Reduce (' + '') die elementweise Summe aller entsprechenden Werte in der 'Mylist' – akrun

0

Warum machen Sie rbind in Ihrer Liste von Datenframes und aggregieren dann?

system.time(teste <- do.call("rbind",mylist)) 
# user system elapsed 
# 0.004 0.000 0.000 

system.time(r1 <- Reduce(function(...) merge(..., by = "ID"), mylist)) 
# user system elapsed 
# 0.004 0.000 0.002 
aggregate(teste$Income, by=list(teste$ID), sum) 
# Group.1 x 
#1  36 7360 
#2  37 0 
#3  38 0 
#4  39 9100 
Verwandte Themen