在R中,SumIf函数的等效函数是什么?

8

我是一名新手,对R和这个网站都不熟悉。我进行了搜索,但没有找到我需要的答案。

如果我有以下数据集“total”:

names <- c("a", "b", "c", "d", "a", "b", "c", "d")
x <- cbind(x1 = 3, x2 = c(3:10))
total <- data.frame(names, x)
total

  names x1 x2
1     a  3  3
2     b  3  4
3     c  3  5
4     d  3  6
5     a  3  7
6     b  3  8
7     c  3  9
8     d  3  10

我该如何创建一个新的数据集,使其像Excel中的SumIf函数一样,只包含唯一的行?
答案应该是一个新的数据集“summary”,它是4 x 3的。
names <- unique(names)
summary <- data.frame(names)
summary$Sumx1 <- ?????
summary$Sumx2 <- ?????
summary

 names Sumx1 Sumx2
1  a     6    10
2  b     6    12
3  c     6    14
4  d     6    16
2个回答

12

使用基本R:

aggregate(. ~ names, data=total, sum)

11

你可以使用plyr包中的ddply函数:

library(plyr)
ddply(total, .(names), summarise, Sumx1 = sum(x1), Sumx2 = sum(x2))

  names Sumx1 Sumx2
1     a     6    10
2     b     6    12
3     c     6    14
4     d     6    16

你也可以使用data.table

library(data.table)
DT <- as.data.table(total)
DT[ , lapply(.SD, sum), by = "names"]

   names x1 x2
1:     a  6 10
2:     b  6 12
3:     c  6 14
4:     d  6 16

有了新的dplyr包,您可以进行以下操作:

library(dplyr)
total %>%
  group_by(names) %>%
  summarise(Sumx1 = sum(x1), Sumx2 = sum(x2))

  names Sumx1 Sumx2
1     d     6    16
2     c     6    14
3     b     6    12
4     a     6    10

如果我的数据表中有超过所需列,是否可以在不创建子数据表的情况下用一行代码完成? - Abhishek Singh
@AbhishekSingh 除非您为它们指定操作,否则在summarise中忽略其他列。 - Sven Hohenstein

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