データフレーム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クエリは「AでDFグループからA、Count(B)を選択」です。
一般に、ベクトル化された操作を使用せず、forループを使用する場合は常に、単一のプロシージャであってもパフォーマンスが非常に遅くなります。
これはよくある質問です。基本的に、探しているオプションは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
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')
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
require(reshape2)
T <- melt(df, id = c("A"))
T <- dcast(T, A ~ variable, sum)
集計に対する正確な利点は確かではありません。