R中SumIf函数的等价物

时间:2014-02-06 15:45:55

标签: r

我是R和这个网站的新手,但我搜索过,但找不到我要找的答案。

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

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

如何创建一个与SumIf Excel函数一样的新数据集,只有唯一的行?

答案应该是一个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 个答案:

答案 0 :(得分:10)

在基地R:

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

答案 1 :(得分:9)

您可以使用ddply包中的plyr

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