2016-08-23 7 views
0

私は最初の列が英数字の行名である大きなデータフレームを持っています。私は各列(ここでは3行)の行のランダムな選択を選択するために、以下のようにidxを使用します。私は今、各idx [i、j]の累積合計を計算する必要があります。私のデータフレームは膨大なので、plyrパッケージの関数は計算時間のために優先されます。どのように私はそれを計算すべきですか?リストとして格納された行の名前に基づいてcumsumを計算する方法は?

library(plyr) 

V1 <- c('t14','t23','t54', 't13', 't1','t102', 't104', 't245') 
V2 <- c(4.2, 5.3, 5.4,6, 7,8.5,9, 10.1) 
V3 <- c(5.1, 5.1, 2.4,6.1, 7.7,5.5,1.99, 5.42) 
my_df <- data.frame(V1, V2, V3) 

#The following line randomly select 3 rows for each column 
idx <- lapply(integer(ncol(my_df)-1), function(...) sample(my_df$V1, 3)) 

おかげで

+1

"私のデータフレームは膨大なので、計算時間のためにplyrパッケージの関数が優先されます" - 意味がありません。 plyrは、その巨大なデータセットに対して高速で拡張性があるわけではなく、シンプルさと使いやすさを考慮して使用します。 –

答えて

1

うまくいけば、他の誰かが(私はこのパッケージで多くの経験を持っていない)plyrソリューションを提案することができます。一方で、ここでdata.tableplyrとして(多分速い)同じくらい速いかもしれソリューションです。

[[1]] 
    V2 
1: 5.4 
2: 10.7 
3: 16.7 

[[2]] 
    V3 
1: 5.1 
2: 11.2 
3: 13.6 

我々はデータフレームを作成します。この時点で

library(plyr) 

V1 <- c('t14','t23','t54', 't13', 't1','t102', 't104', 't245') 
V2 <- c(4.2, 5.3, 5.4,6, 7,8.5,9, 10.1) 
V3 <- c(5.1, 5.1, 2.4,6.1, 7.7,5.5,1.99, 5.42) 
my_df <- data.frame(V1, V2, V3, stringsAsFactors = F) 

#The following line randomly select 3 rows for each column 
set.seed(100) # Setting seed so that this example is reproducible 
idx <- lapply(integer(ncol(my_df)-1), function(...) sample(my_df$V1, 3)) 

idx 

# Additional code 

# Import the data.table package - you'd want to move this line to the top of your code 
library(data.table) 
setDT(my_df) # Cast the data.frame to data.table 
setkey(my_df, V1) # Set the key for the data.table to V1 

# With the key set as V1, I can just call idx[[i]] as the first argument of my_df 
# This will map each value of idx[[i]] to the appropriate row based on V1 
# In the following, for the i-th vector in idx, I calculate the cumulative sum of each of V_{i + 1} 
myResult = lapply(1:length(idx), function(i){ 
     my_df[idx[[i]], lapply(.SD, cumsum), .SDcols = i + 1] 
    } 
) 

、myResultリストです次のように:

# Column bind to create matrix of results 
myResult = do.call(cbind, myResult) 

結果は次のようになります

 V2 V3 
1: 5.4 5.1 
2: 10.7 11.2 
3: 16.7 13.6 
+0

これに時間と労力を費やしてくれてありがとう@Jav。私は2次元を持つidxが必要なので、idxをベクトルに変換すべきではないと思います。同じ行名が異なる列に異なる値を持つことがあるので、最終出力では、各列の累積合計が別々の列にあると考えられます。この例の場合、V2と別の列の( 't54'、 't54' + 't23'、t54 '+' t23 '+' t13 ')を含む1つの列は、( "t14"、 "t14" 「t13」、「t14」+「t13」+「t54」)を含む。 – vahab

+0

私は申し訳ありませんが、私は主に累積合計を反映するコードの最後の行を修正しました。私もidxをリストとして残しました。上記の出力が期待どおりであるかどうかを教えてください。 – jav

+0

また、より多くの列に対してこれを一般化する必要がある場合は、私に知らせてください。それに応じて上記を編集することができます。 – jav

関連する問題