65

データフレーム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

4 に答える 4

101

これはよくある質問です。基本的に、探しているオプションは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
于 2013-09-14T08:39:20.020 に答える
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')
于 2015-01-31T19:53:42.393 に答える
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
于 2013-09-14T09:38:40.370 に答える
4
require(reshape2)

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

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

骨材に対する正確な利点はわかりません。

于 2015-07-31T00:40:04.407 に答える