2017-10-10 12 views
2

私はStackOverflowの以前の質問を見てきましたが、私が抱えている問題に対応できる解決策が見つかりませんでした。あなたがここにそれを必要とすべきであるデータフレームの値を配列のインデックスとして使用する

source destination year ship count 
     1   1415  1  6  0 
     1   1415  2  6  0 
     1   1415  3  6  0 
     1   1415  4  6  0 
     1   1415  5  6  0 
     1   1415  6  6  0 

コピー可能コード:

df <- structure(list(source = c(1L, 1L, 1L, 1L, 1L, 1L), destination = 
c(1415, 1415, 1415, 1415, 1415, 1415), year = 1:6, ship = c(6, 
6, 6, 6, 6, 6), count = c(0, 0, 0, 0, 0, 0)), .Names = c("source", 
"destination", "year", "ship", "count"), class = "data.frame", 
row.names = c(NA, 6L)) 

私も4次元配列を持っている

基本的に、私はデータフレームを持って、私たちはこのように見えることdfと呼ぶことにしますm1に電話します。基本的に、dfの最初の4つの列のそれぞれは、m1の4つの次元 - 基本的にインデックスに対応しています。おそらく今のところ推測できる通り、dfの5番目の列は実際にm1に格納されている値に対応しています。例えば、df$count[3] <- m1[1,1415,3,6]

現在のところ、countの列全体は空で、私はそれを記入したいと思います。小さな仕事だった場合、私はそれをゆっくりと愚かなやり方で行い、for-loopを使用しますが、問題は、dfに約300,000,000行があり、m1のサイズは約3900 x 3900 x 35 x 7です。結果として、1日の実行後の次のアプローチは、行の5%しか得られませんでした。

for(line in 1:nrow(df)){ 
    print(line/nrow(backcastdf)) 
    df$count[line] <- m1[df$source[line], df$destination[line], df$year[line], df$ship[line]] 
} 

これをより速く行う方法に関するアイデアはありますか?

+0

はたぶん、あなたは' purrrを使用することができますか? – Jeremy

+0

私は 'purrr'パッケージに慣れていないので、私はそれを調べて、あなたに連絡しなければなりません。 –

答えて

3

あなたの質問から分かる限り、あなたは行列インデックスを探しているだけです。

以下の簡単な例を考えてみましょう。

まず、お客様のarray(4つのディメンション)。

dim1 <- 2; dim2 <- 4; dim3 <- 2; dim4 <- 2 
x <- dim1 * dim2 * dim3 * dim4 

set.seed(1) 
M <- `dim<-`(sample(x), list(dim1, dim2, dim3, dim4)) 
M 
## , , 1, 1 
## 
##  [,1] [,2] [,3] [,4] 
## [1,] 9 18 6 29 
## [2,] 12 27 25 17 
## 
## , , 2, 1 
## 
##  [,1] [,2] [,3] [,4] 
## [1,] 16 5 14 20 
## [2,] 2 4 8 32 
## 
## , , 1, 2 
## 
##  [,1] [,2] [,3] [,4] 
## [1,] 31 28 24 7 
## [2,] 15 11 3 23 
## 
## , , 2, 2 
## 
##  [,1] [,2] [,3] [,4] 
## [1,] 13 1 21 30 
## [2,] 19 26 22 10 
## 

第2に、興味のある指標を持つdata.frameです。

mydf <- data.frame(source = c(1, 1, 2, 2), 
        destination = c(1, 1, 2, 3), 
        year = c(1, 2, 1, 2), 
        ship = c(1, 1, 2, 1), 
        count = 0) 
mydf 
## source destination year ship count 
## 1  1   1 1 1  0 
## 2  1   1 2 1  0 
## 3  2   2 1 2  0 
## 4  2   3 2 1  0 

第三に、エキス:

out <- M[as.matrix(mydf[1:4])] 
out 
# [1] 9 16 11 8 

第四には、比較:マップ() ​​`:

M[1, 1, 1, 1] 
# [1] 9 
M[1, 1, 2, 1] 
# [1] 16 
M[2, 2, 1, 2] 
# [1] 11 
M[2, 3, 2, 1] 
# [1] 8 
+0

ああ、それは本当に簡単ですか?ホールド、私のデータでこのアプローチをチェックさせて、私はあなたに戻ってきます。 –

+0

ちょうどチェック - 完全に動作し、約1分かかりました。 –

関連する問題