对data.frame中的不同列求和

时间:2012-11-12 21:52:22

标签: r dataframe

我有一个非常大的data.frame,想要对每一列中的值求和。

所以我使用了以下代码:

sum(production[,4],na.rm=TRUE)

sum(production$X1961,na.rm=TRUE)

问题是data.frame非常大。而且我只想将40个特定列与我的data.frame的不同名称相加。而且我不想列出每一列。有更聪明的解决方案吗?

最后,我还希望将每个列的总和存储在新的data.frame中。

提前致谢!

3 个答案:

答案 0 :(得分:13)

试试这个:

colSums(df[sapply(df, is.numeric)], na.rm = TRUE)

其中sapply(df, is.numeric)用于检测所有数字列。

如果您只想总结几列,请执行以下操作:

colSums(df[c("X1961", "X1962", "X1999")], na.rm = TRUE)

答案 1 :(得分:4)

res <- unlist(lapply(production, function(x) if(is.numeric(x)) sum(x, na.rm=T)))

将返回每个数字列的总和。

您可以根据

的结果创建新的数据框
data.frame(t(res))

答案 2 :(得分:2)

如果您不想包含每一列,您必须以某种方式指出要包含哪些列(或者,要排除哪些列)

colsInclude <- c("X1961", "X1962", "X1963") # by name
    # or # 
colsInclude <- paste0("X", 1961:2003)  # by name
    # or # 
colsInclude <- c(10:19, 23, 55, 147)   # by column number

要将这些列放在新数据框中,只需使用[ ]即可:&#39;

newDF <- oldDF[, colsInclude]

要总结每一列,只需使用colSums

sums <- colSums(newDF, na.rm=T)
    # or # 
sums <- colSums(oldDF[, colsInclude], na.rm=T)    

请注意,sums将是一个向量,而不是必需的数据框。 您可以使用as.data.frame

将其转换为数据框
sums <- as.data.frame(sums)
    # or, to include the data frame from which it came #
sums <- rbind(newDF, "totals"=sums)