6

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

所以我使用了以下代码:

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

或者

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

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

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

提前致谢!

4

3 回答 3

14

尝试这个:

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

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

如果您只想对几列求和,请执行以下操作:

colSums(df[c("X1961", "X1962", "X1999")], na.rm = TRUE)
于 2012-11-12T22:28:32.747 回答
4
res <- unlist(lapply(production, function(x) if(is.numeric(x)) sum(x, na.rm=T)))

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

您可以根据结果创建一个新的数据框

data.frame(t(res))
于 2012-11-12T21:56:15.060 回答
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

要将这些列放入新的数据框中,只需[ ]按照您所做的那样使用:'

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)
于 2012-11-12T22:52:17.473 回答