2016-09-26 2 views
1

Ich habe eine Liste von 17 data.frames, jedes stellt einige Variablen einer Wirtschaft in einem Jahr, von 1995 bis 2011 dar.Summe Spalten von jedem data.frame in einer Liste, geben Sie einen einzigen Datenrahmen mit den Summen

Ich möchte die Summe jeder Spalte jeder Datenbank erhalten und daraus eine neue Datenbank erstellen. Also würde die neue Datenbank aus 17 Zeilen und der gleichen Anzahl von Spalten der Datenrahmen bestehen, die ich jetzt habe, jede Zeile repräsentiert ein Jahr und jede Zelle die Summe der Variablen in der Spalte für dieses Jahr.

Ich habe versucht, eine Funktion zu schreiben, aber wirklich kann nicht erhalten, was ich will.

Ich weiß, ich habe zu verwenden:

newdf <- lapply(list, FUN = functionname) 

aber ich kann nicht finden, wie die Funktion zu schreiben.

Ein Beispiel:

df1 <- data.frame(1:3,4:6) 
colnames(df1) <- c("one", "two") 
df2 <- data.frame(2:4, 3:5) 
colnames(df2) <- c("one", "two") 

würde Ich mag eine neue df erhalten:

df3 <- data.frame(c(6,9),c(15, 12)) 
colnames(df3) <- c("one","two") 

    one two 
1 6 15 
2 9 12 

Antwort

1

Mit lapply:

df1 <- data.frame(1:3,4:6) 
colnames(df1) <- c("one", "two") 
df2 <- data.frame(2:4, 3:5) 
colnames(df2) <- c("one", "two") 

l <- list(df1,df2) 

do.call(rbind,lapply(l, colSums)) 

EDIT: Versuchen Sie diese anstelle der letzten Zeile?

do.call(rbind,lapply(l, function(x) { 
    colSums(x[,sapply(x, is.numeric)]) 
})) 

EDIT 2:

df1 <- data.frame(1:3,4:6,c("a","asdf","asdf")) 
colnames(df1) <- c("one", "two", "thr") 
df2 <- data.frame(2:4, 3:5, c("asdf","casd","sdfasdf")) 
colnames(df2) <- c("one", "two", "thr") 

l <- list(df1,df2) 

do.call(rbind,lapply(l, function(x) { 
    colSums(x[,sapply(x, is.numeric)]) 
})) 
+0

Ich habe ein Problem: nicht jede Spalte ist numerisch. Wie kann ich nur die numerische Summe addieren und in dieser Funktion anwenden? – Francesco

+0

Was hätten Sie mit den nicht numerischen Spalten gemacht? – prateek1592

+0

Nichts, ich kann sie verlassen. – Francesco

1

starten:

df1 <- data.frame(1:3,4:6) 
colnames(df1) <- c("one", "two") 
df2 <- data.frame(c(2:4,'aa'), c(3:5,'bb')) 
colnames(df2) <- c("one", "two") 
df3 <- data.frame(c(6,9),c(15, 12)) 
colnames(df3) <- c("one","two") 


df.lst <- list(df1, df2) 
newdf <- NULL 
for (df in df.lst) { 
    df[] <- lapply(df, function(x) as.numeric(as.character(x))) 
    newdf <- rbind(newdf, colSums(df, na.rm=TRUE)) 
} 
newdf 
+0

Ich bekomme einen Fehler in colSums, weil nicht alle meine Variablen numerisch sind. – Francesco

+0

müssen Sie zuerst die Variablen in numerische konvertieren. –

+0

aktualisiert mit numerischer Konvertierung –

1

Mit lapply

> output <- data.frame(lapply(list(df1, df2), colSums)) # this gives you col sums 
> colnames(output) <- colnames(df1) # naming columns 
> output # printing result just as you want 
    one two 
one 6 9 
two 15 12 
1

Hier ist eine Lösung, die einen Datenrahmen (zwei der Lösungen zurückgeben Matrizen) liefert und stellt auch sicher nicht auszuschließen numerische Spalten aus der Summierung.

library(magrittr) 
library(dplyr) 

df1 <- data.frame(1:3,4:6) 
colnames(df1) <- c("one", "two") 
df2 <- data.frame(2:4, 3:5) 
colnames(df2) <- c("one", "two") 

df.lst <- list(df1, df2) 

tidied_df <- 
    # Add a column for the year into each data frame. 
    mapply(function(DF, YEAR) mutate(DF, YEAR = YEAR), 
     DF = df.lst, 
     YEAR = c("200x", "200y"), # Provide a vector of your years here 
     SIMPLIFY = FALSE) %>% 
    # Bind into a single data frame 
    bind_rows() %>% 
    # Select only the YEAR and numeric columns 
    select_(.dots = c("YEAR", names(.)[vapply(., is.numeric, logical(1))])) %>% 
    # Group by year 
    group_by(YEAR) %>% 
    # Calculate the sums 
    summarise_each(funs = "sum") 
Verwandte Themen