2016-09-26 69 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") 
相关问题