2016-09-26 72 views
1

我有一個17個data.frames的列表,每一個代表一個經濟體在1995年至2011年的一些變量。列表中的每個數據幀的列總和,給出一個唯一的數據框與總和

我想獲得每個數據庫的每一列的總和,並從中創建一個新的數據庫。因此,新的數據庫將由17行和我現在具有的數據幀的相同列數組成,每行代表一年,每個單元格爲該年的列中變量的總和。

我試圖寫一個函數,但真的無法獲得我想要的。

我知道我必須使用:

newdf <- lapply(list, FUN = functionname) 

,但我找不到怎麼寫的功能。

一個例子:

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:

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

    one two 
1 6 15 
2 9 12 

回答

1

使用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)) 

編輯:試試這一個,而不是最後一行?

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

編輯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

我有一個問題:不是每列都是數字。我怎樣才能總結數字之一,在這個函數中應用它? – Francesco

+0

你會對非數字列做什麼? – prateek1592

+0

沒什麼,我可以離開他們。 – Francesco

1

試試這個:

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

我在colSums中得到一個錯誤,因爲不是所有的變量都是數字。 – Francesco

+0

您需要首先將變量轉換爲數字。 –

+0

用數值轉換 –

1

使用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

下面是返回一個數據幀(兩個解決方案的返回矩陣)的解決方案,並確保排除非總和中的數字列。

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") 
相關問題