在R中,对于数据框的每一列求和

58

考虑到该数据集:

  Name Height Weight
1 Mary     65    110
2 John     70    200
3 Jane     64    115

我想对每个限定列(身高和体重)求和,得出

 199  425

问题在于限定词可能不止两个(即不仅限于身高和体重)。

我能做到这点。

    # Create the dataframe people
    Name <- c("Mary", "John", "Jane")
    Height <- c(65,70,64)
    Weight <- c(110,200,115)
    people <- data.frame(Name, Height, Weight)

    res <- c(sum(people$Height),sum(people$Weight))

当限定词增加时,句子变得太长了。 有没有更简洁的方法?

5个回答

94
您可以使用函数colSums()来计算所有值的总和。[,-1]确保排除了第一列人名。
 colSums(people[,-1])
Height Weight 
   199    425
假设有多个不是数字的列,或者您的列顺序不固定,更通用的方法如下:
colSums(Filter(is.numeric, people))

22

我们可以使用 dplyr 选择仅为数值的列,并使用 purr 来获取所有列的 sum。(也可用于获取所有列的其他任何值,例如平均值、最小值、最大值等。)

library("dplyr")
library("purrr")

people %>%
    select_if(is.numeric) %>%
    map_dbl(sum)

另一种简单的方法是只使用 dplyr - 从 (dplyr 1.0.0) 开始,我们可以使用 across()

library("dplyr")
people %>%
    summarise(across(where(is.numeric), ~ sum(.x, na.rm = TRUE)))

library("dplyr")
people %>%
    summarize_if(is.numeric, sum, na.rm=TRUE)

5
mapply(sum,people[,-1])

Height Weight 
   199    425 

4

为了完整起见:

 apply(people[,-1], 2, function(x) sum(x))
#Height Weight 
#   199    425 

4
是的,这个方法确实可行,但它明显不如 colSums 高效,而且打字时间更长。 - Gregor Thomas

0

你也可以尝试 a <- apply(mtcars[,c(select.colums)], 2, sum )

a <- apply(people[,c(2,3)], 2, sum )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接