R:colSums,并非所有列都是数字

时间:2015-05-27 16:26:54

标签: r

我有以下数据框

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列留空或允许我打印“总计”?

提前致谢!!

7 个答案:

答案 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