data.frame分组按列

我有一个dataframeDF。

说DF是:

AB 1 1 2 2 1 3 3 2 3 4 3 5 5 3 6 

现在我想把列A中的行组合在一起,并得到列B的总和。

例如:

  AB 1 1 5 2 2 3 3 3 11 

我正在使用sqldf函数使用SQL查询。 但由于某种原因,它非常缓慢。 有没有更方便的方法来做到这一点? 我也可以使用for循环手动执行它,但是它又慢了。 我的SQL查询是“select一个,从DF组从A计数(B)”。

一般来说,当我不使用向量化操作时,我使用for循环,即使对于单个过程,性能也是非常慢的。

这是一个常见的问题。 在基地,你正在寻找的选项是aggregate 。 假设你的data.frame被称为“mydf”,你可以使用下面的代码。

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

我也build议查看“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 

使用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] ## ## AB ## 1 1 5 ## 2 2 3 ## 3 3 11 

使用sqldf

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

我会build议看一下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 AB 1 1 5 2 2 3 3 3 11 
 require(reshape2) T <- melt(df, id = c("A")) T <- dcast(T, A ~ variable, sum) 

我不确定总体上的确切优势。