我有一个非常大的 data.frame 并且想要对每一列中的值求和。
所以我使用了以下代码:
sum(production[,4],na.rm=TRUE)
或者
sum(production$X1961,na.rm=TRUE)
问题是 data.frame 非常大。而且我只想将 40 个具有不同名称的 data.frame 列相加。而且我不想列出每一列。有更聪明的解决方案吗?
最后,我还想将每列的总和存储在一个新的 data.frame 中。
提前致谢!
尝试这个:
colSums(df[sapply(df, is.numeric)], na.rm = TRUE)
wheresapply(df, is.numeric)
用于检测所有数字列。
如果您只想对几列求和,请执行以下操作:
colSums(df[c("X1961", "X1962", "X1999")], na.rm = TRUE)
res <- unlist(lapply(production, function(x) if(is.numeric(x)) sum(x, na.rm=T)))
将返回每个数字列的总和。
您可以根据结果创建一个新的数据框
data.frame(t(res))
如果您不想包含每一列,则必须以某种方式指出要包含哪些列(或者,要排除哪些列)
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)