我有一个非常大的data.frame,想要对每一列中的值求和。
所以我使用了以下代码:
sum(production[,4],na.rm=TRUE)
或
sum(production$X1961,na.rm=TRUE)
问题是data.frame非常大。而且我只想将40个特定列与我的data.frame的不同名称相加。而且我不想列出每一列。有更聪明的解决方案吗?
最后,我还希望将每个列的总和存储在新的data.frame中。
提前致谢!
答案 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)