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)
我不确定总体上的确切优势。