1

私は次のものを持っています:

データフレーム内の行のハッシュのように機能する環境。たとえば、環境「inc」にはキー「hello」があり、get("hello", envir = inc)「row1」「row2」「row50」を返します。これらはデータフレーム内の行の名前です。環境内のキーにこれらの行を選択した後、それらに対してcolSumsを実行します。

環境には約400,000のエントリがあり、これらのcolSumに基づいて400,000行の新しいデータフレームを作成したいと思います。私は基本的にlapply/foreachを使用してこれを行う作業コードを持っており、データの小さなサブセットでそれを使用しました...しかしそれは信じられないほど遅いです。のように...doMCを使用して3コアで20分間実行されていますが、まだ実行されていません。コードは次のとおりです。

incCounts <- foreach(key = ls(inc)) %dopar% {
       transNames <- get(key, envir = inc)
       transCounts <- df[transNames, ]
       if ( ! is.null(dim(transCounts)) )
           transCounts <- colSums(transCounts)
       return(transCounts)
}
incCounts <- as.data.frame(t(simplify2array(incCounts)))

編集:これは私がdata.frameとdata.tableでやろうとしていることの例です:

library(data.table)
set.seed(20)
transEnv <- new.env(hash = TRUE)
assign("hash1", paste("trans", 2:4, sep = ""), envir = transEnv)
assign("hash2", paste("trans", c(1, 3), sep = ""), envir = transEnv)

df <- data.frame(matrix(rnorm(5 * 4), nrow = 4, ncol = 5))
rownames(df) <- paste("trans", 1:4, sep = "")
colSums(df[transEnv$hash1, ]) # what I want
       X1         X2         X3         X4         X5 
0.9476963 -3.2149230  0.7603257 -1.8494967  1.7569055

dt <- data.table(trans = rownames(df), df)
setkey(dt, trans)

# This isn't working as I expected... 
dt[transEnv$hash1, list(sum(X1), sum(X2), sum(X3), sum(X4), sum(X5))]

      trans         V1         V2         V3        V4         V5
[1,] trans2 -0.1444402 -1.4720633 -0.6135086  1.108451 1.24556891
[2,] trans3  0.7222297 -0.5961595 -0.2163115 -1.097342 0.08785472
[3,] trans4  0.3699069 -1.1467001  1.5901458 -1.860606 0.42348190

どんな助けでも大歓迎です!ありがとう!

4

1 に答える 1

3

に適している可能性がありdata.tableます。wikiポイント5とこの回答を参照してください。試してみる場合は、から始めてくださいvignette('datatable-intro')

DT[,lapply(.SD,sum),by=grp]



編集に答えるために、の関連セクション?data.tableは次のとおりです。

高度:既知のグループのサブセットの集約は、それらのグループをで渡す場合に特に効率的iです。iがの場合data.table、の各行をDT[i,j]評価します。これをbyなしで、またはでグループ化して呼びます。jii

だから代わりに

dt[transEnv$hash1, list(sum(X1), sum(X2), sum(X3), sum(X4), sum(X5))]

試す :

dt[transEnv$hash1, list(sum(X1),sum(X2),sum(X3),sum(X4),sum(X5)), mult="last"]

また、

dt[transEnv$hash1][, list(sum(X1), sum(X2), sum(X3), sum(X4), sum(X5))]

また、

dt[transEnv$hash1,lapply(.SD,sum),by="",.SDcols=names(dt)[-1]]

また、

dt[transEnv$hash1][,trans:=NULL][,sapply(.SD,sum)] 
于 2012-06-13T13:58:31.333 に答える