我有以下数据框
Type CA AR
alpha 1 5
beta 4 9
gamma 3 8
我想获得列和行总和,使其看起来像这样:
Type CA AR Total
alpha 1 5 6
beta 4 9 13
gamma 3 8 11
Total 8 22 30
我能够做rowSums(如上所示)我想因为它们都是数字的。
colSums(df)
然而,当我做colSums时,我得到错误'x必须是数字'。我意识到这是因为“类型”列不是数字。
如果我执行以下代码,以便尝试将值打印到第4行(并且只汇总第2到第4列)
df[,4] = colSums(df[c(2:4)]
然后我得到一个错误,即替换与数据大小不同。
有谁知道如何解决这个问题?我想打印第2-4列的列总和,并将第1列留空或允许我打印“总计”?
提前致谢!!
答案 0 :(得分:4)
plyr包中的结帐$min
。
numcolwise()
结果:
library(plyr)
df <- data.frame(
Type = c("alpha", "beta", "gamme"),
CA = c(1, 4, 3),
AR = c(5, 9, 8)
)
numcolwise(sum)(df)
答案 1 :(得分:4)
使用matrix
:
m <- as.matrix(df[,-1])
rownames(m) <- df$Type
# CA AR
# alpha 1 5
# beta 4 9
# gamma 3 8
然后添加边距:
addmargins(m,FUN=c(Total=sum),quiet=TRUE)
# CA AR Total
# alpha 1 5 6
# beta 4 9 13
# gamma 3 8 11
# Total 8 22 30
更简单的addmargins(m)
也可以,但默认使用“Sum”标记边距。
答案 2 :(得分:4)
你是对的,这是因为第一列不是数字。
尝试将第一列用作rownames:
df <- data.frame(row.names = c("alpha", "beta", "gamma"), CA = c(1, 4, 3), AR = c(5, 9, 8))
df$Total <- rowSums(df)
df['Total',] <- colSums(df)
df
输出将是:
CA AR Total
alpha 1 5 6
beta 4 9 13
gamma 3 8 11
Total 8 22 30
如果您需要“类型”一词,只需删除rownames并将列添加回来:
Type <- rownames(df)
df <- data.frame(Type, df, row.names=NULL)
df
它的输出:
Type CA AR Total
1 alpha 1 5 6
2 beta 4 9 13
3 gamma 3 8 11
4 Total 8 22 30
答案 3 :(得分:2)
使用:
df$Total <- df$CA + df$AR
更通用的解决方案:
data$Total <- Reduce('+',data[, sapply(data, is.numeric)])
编辑:我意识到我完全误解了这个问题。你确实正在寻找行的总和,我给了一些列。
改为做行:
data <- data.frame(x = 1:3, y = 4:6, z = as.character(letters[1:3]))
data$z <- as.character(data$z)
rbind(data,sapply(data, function(y) ifelse(test = is.numeric(y), Reduce('+',y), "Total")))
答案 4 :(得分:1)
如果您不知道哪些列是数字的,而是想要行之和,那么请执行以下操作:
df$Total = rowSums( df[ sapply(df, is.numeric)] )
is.numeric
函数将返回一个逻辑值,该值对于选择列有效,sapply
将逻辑值作为向量返回。
要添加一组列总计和总计,我们需要回退到创建数据集的位置,并阻止&#34;类型&#34;列被构建为一个因素:
dat <- read.table(text="Type CA AR
alpha 1 5
beta 4 9
gamma 3 8 ",stringsAsFactors=FALSE)
dat$Total = rowSums( dat[ sapply(dat, is.numeric)] )
rbind( dat, append(c(Type="Total"),
as.list(colSums( dat[ sapply(dat, is.numeric)] ))))
#----------
Type CA AR Total
1 alpha 1 5 6
2 beta 4 9 13
3 gamma 3 8 11
4 Total 8 22 30
这是一个data.frame:
> str( rbind( dat, append(c(Type="Total"), as.list(colSums( dat[ sapply(dat, is.numeric)] )))) )
'data.frame': 4 obs. of 4 variables:
$ Type : chr "alpha" "beta" "gamma" "Total"
$ CA : num 1 4 3 8
$ AR : num 5 9 8 22
$ Total: num 6 13 11 30
答案 5 :(得分:0)
我认为这应该可以解决你的问题
x<-data.frame(type=c('alpha','beta','gama'), x=c(1,2,3), y=c(4,5,6))
x[,'Total'] <- rowSums(x[,c(2:3)])
x<-rbind(x,c(type = c('Total'), c(colSums(x[,c(2:4)]))))
答案 6 :(得分:0)
library(tidyverse)
df <- data.frame(
Type = c("alpha", "beta", "gamme"),
CA = c(1, 4, 3),
AR = c(5, 9, 8)
)
df2 <- colSums(df[, c("CA", "AR")])
# CA AR
# 8 22