数据框按列分组

67

我有一个数据框 DF。

假设 DF 为:

  A B
1 1 2
2 1 3
3 2 3
4 3 5
5 3 6 

现在我想将A列相同的行合并,并计算B列的总和。

例如:

  A B
1 1 5
2 2 3
3 3 11

我目前使用 sqldf 函数的 SQL 查询来完成这个任务,但由于某些原因速度非常慢。有没有更方便的方法来完成这个任务呢?我也可以使用 for 循环手动执行,但速度同样很慢。我的 SQL 查询是“Select A,Count(B) from DF group by A”。一般而言,如果我不使用向量化操作并使用 for 循环,即使对于单个过程,性能也会非常慢。

4个回答

105

这是一个常见问题。在基础中,您要寻找的选项是 aggregate。假设您的data.frame被称为“mydf”,您可以使用以下内容。

> aggregate(B ~ A, mydf, sum)
  A  B
1 1  5
2 2  3
3 3 11

我还建议研究一下"data.table"包。

> library(data.table)
> DT <- data.table(mydf)
> DT[, sum(B), by = A]
   A V1
1: 1  5
2: 2  3
3: 3 11

请注意,~是一个“公式”,它会生成一个“公式对象”。 - Josiah Yoder

27

使用dplyr

require(dplyr)    
df <- data.frame(A = c(1, 1, 2, 3, 3), B = c(2, 3, 3, 5, 6))
df %>% group_by(A) %>% summarise(B = sum(B))

## Source: local data frame [3 x 2]
## 
##   A  B
## 1 1  5
## 2 2  3
## 3 3 11

使用sqldf

library(sqldf)
sqldf('SELECT A, SUM(B) AS B FROM df GROUP BY A')

9

我建议看一下plyr包。虽然它可能没有data.table或其他包快,但对于刚开始使用R并需要进行一些数据操作的人来说,它非常有教育意义。

> DF <- data.frame(A = c("1", "1", "2", "3", "3"), B = c(2, 3, 3, 5, 6))
> library(plyr)
> DF.sum <- ddply(DF, c("A"), summarize, B = sum(B))
> DF.sum
  A  B
1 1  5
2 2  3
3 3 11

4
require(reshape2)

T <- melt(df, id = c("A"))

T <- dcast(T, A ~ variable, sum)

我不确定与总计相比的确切优势。


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