R:如何对列表中的多列数据帧求和?

时间:2016-09-09 21:40:55

标签: r sum lapply

我想在列表中对多列数据帧求和,只显示总和而不显示(计算)输入列。这是一个例子:

ls <- list(data.frame(a=1, b=5, c=3, d=2), data.frame(a=NA, b=2, c=7, d=9))

ls
[[1]]
  a b c d
1 1 5 3 2

[[2]]
   a b c d
1 NA 2 7 9

我的预期结果是:

ls2
[[1]]
  c new
1 3   8

[[2]]
  c new
1 7  11

任何想法如何做到这一点?到目前为止,我尝试为列表增强此answer,但没有成功,也没有省略输入列(a,b,d)。我到目前为止尝试了lapply:

lapply(ls, function(x) x$e <- rowSums(x[,c("a", "b", "d")], na.rm=T)) 
and 
ls$e <- lapply(ls, function(x) rowSums(x[,c("a", "b", "d")], na.rm=T)) 

提前谢谢

修改: 感谢Aech和Abdou的回答,这个例子很好用。但是,我有> 200列,你知道一种方法而不编写将保留的列吗?就像删除我用于计算的列,而不是命名所有列。

编辑2: 感谢您改进的代码,它可以很好地处理示例数据。但是,由于我的真实数据集不...我收到以下错误:

Error in rowSums(x[, columns_to_sum], na.rm = T) : 
 'x' must be an array of at least two dimensions"

我的列表有大约96个矩阵,有200列和一行。但我不知道如何准备一个可重复的错误示例。有任何想法吗?

2 个答案:

答案 0 :(得分:3)

您不应将列表命名为 ls ,因为ls是一个函数。

lapply(myList, function(x) data.frame(c=x$c, new = rowSums(x[,c("a", "b", "d")], na.rm=T))) 

这是一个解决方案,您只需指定已删除的列(编辑后):

dropped <- c("a", "b", "d")
lapply(myList, function(x) {
  x$new <- rowSums(x[,dropped], na.rm=T)
  x[!names(x) %in% dropped]
  }) 

答案 1 :(得分:2)

尝试:

lapply(ls, function(x) {
    x$new <- rowSums(x[,c("a", "b", "d")], na.rm=T)
    return(x[,c("c","new")])
})

编辑:

您可以将要使用的列rowSums放入变量中,如下所示:

lapply(ls, function(x) {
    columns_to_sum <- c("a", "b", "d")
    x$new <- rowSums(x[,columns_to_sum], na.rm=T)
    return(x[,!colnames(x) %in% columns_to_sum])
})

此处columns_to_sum是保存您要应用rowSums的列名称的变量。

我希望这会有所帮助。