data.frame 按列分组[重复]

Posted

技术标签:

【中文标题】data.frame 按列分组[重复]【英文标题】:data.frame Group By column [duplicate] 【发布时间】:2013-09-18 22:38:23 【问题描述】:

我有一个数据框 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 循环时,即使对于单个过程,性能也会非常缓慢。

【问题讨论】:

【参考方案1】:

这是一个常见的问题。在 base 中,您正在寻找的选项是 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

【讨论】:

注意~是一个“公式”并产生一个“公式对象”【参考方案2】:

我建议您查看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

【讨论】:

【参考方案3】:

使用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')

【讨论】:

【参考方案4】:
require(reshape2)

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

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

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

【讨论】:

以上是关于data.frame 按列分组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

百分位数分组表[重复]

基于列的分组[重复]

在 xsl:fo 表中按列行值分组

ListView 按列值分组

限制按列分组

计算按列分组的模式