2016-07-20 1 views
3

私はネストされたlapplyのための効率的な代替案を探しています、私はネストされた構造を使用してRコミュニティでは評価されないと思います。誰でも可能なアイデアを提案することができますか、またはカスタム関数でネストlapplyを使用しないようにする方法はありますか?ここでRでネストされたlapplyを使用しないようにするには?

は、迅速な再現性の例である:

a.big <- a[a$score >10,] 
a.sml <- a[(a$score > 6 & a$score <= 10),] 
a.non <- a[a$score < 6,] 

a_new <- list('big'=a.big, 'sml'=a.sml) 
tar.list <- list(b,c) 

test <- lapply(a_new, function(ele_) { 
    re <- lapply(tar.list, function(li) { 
    out <- base::setdiff(ele_, li) 
    return(out) 
    }) 
}) 

目的:

避ける私はlapplyネストされたが、これを回避したいを使用したデータ

a <- data.frame(
    start=seq(1, by=9, len=18), stop=seq(6, by=9, len=18), 
    ID=letters[seq(1:18)], score=sample(1:25, 18, replace = FALSE)) 
b <- data.frame(
    start=seq(2, by=11, len=20), stop=seq(8, by=11, len=20), 
    ID=letters[seq(1:20)], score=sample(1:25, 20, replace = FALSE)) 
c <- data.frame(
    start=seq(4, by=11, len=25), stop=seq(9, by=11, len=25), 
    ID=letters[seq(1:25)], score=sample(1:25, 25, replace = FALSE)) 

機能をシミュレート

そのネストされたlapplyを使用して、その効率的な代替案を見つけること。私は、再現するのが簡単で速くなければならない出力をより良く表現し、下流/下流の計算を高速/簡単に行うことを意味します。これを行うための一般的なアプローチはありますか?

testにネストされたlapplyを使用しないようにするにはどうすればよいですか?誰もがこの問題を解決するための可能なアイデアを提案できますか?おかげ

敬具:

+0

新しいRセッションでサンプルコードを実行しようとしましたか?また、あなたは何をしようとしているのか、単にコードを貼り付けるのかを記述する必要があります。 – hrbrmstr

+0

@hrbrmstr:はい、試してみましたが、カスタム関数でネストされたlapplyを使用した場合、期待していないものが返されます。上記のコードは、私の関数の結果に基づいてシミュレートされます。私は大きなdata.frameオブジェクトを扱うために入れ子構造を置き換えるための一般的な戦略を模索しています。この問題を回避するための一般的なアプローチは何ですか? – user88911

+0

@ジンボウ:リストのようなオブジェクト以外のすべての出力を受け入れることができます。あなたは答えとしてあなたの可能なアプローチをここで詳しく説明できますか? – user88911

答えて

5

私はあなたが本当に欲しいものはわかりません。あなたの両方のリストのすべての組み合わせのsetdiffような場合でも、あなたはこのようなものを使用することができますダブル[[]] braketsを使用して

# all combinations 
a <- expand.grid(seq_along(a_new), seq_along(tar.list)) 
a 
    Var1 Var2 
1 1 1 
2 2 1 
3 1 2 
4 2 2 
# apply over all combinations setdiff row-vice 
apply(a, 1, function(x, y, z){ setdiff(y[x[1]], z[x[2]])}, a_new, tar.list)[1:2] 
[[1]] 
[[1]][[1]] 
    start stop ID score 
2  10 15 b 21 
3  19 24 c 12 
6  46 51 f 23 
9  73 78 i 15 
10 82 87 j 19 
11 91 96 k 25 
13 109 114 m 11 
16 136 141 p 17 
17 145 150 q 18 
18 154 159 r 24 


[[2]] 
[[2]][[1]] 
    start stop ID score 
5  37 42 e  9 
14 118 123 n  8 
15 127 132 o  7 

をあなたに一つだけのリストのクリーナー出力を提供します。

apply(a, 1, function(x, y, z){ setdiff(y[[x[1]]],z[[x[2]]])}, a_new, tar.list) 

[[1]] 
    start stop ID score 
2  10 15 b 21 
3  19 24 c 12 
6  46 51 f 23 
9  73 78 i 15 
10 82 87 j 19 
11 91 96 k 25 
13 109 114 m 11 
16 136 141 p 17 
17 145 150 q 18 
18 154 159 r 24 

[[2]] 
    start stop ID score 
5  37 42 e  9 
14 118 123 n  8 
15 127 132 o  7 

[[3]] 
    start stop ID score 
2  10 15 b 21 
3  19 24 c 12 
6  46 51 f 23 
9  73 78 i 15 
10 82 87 j 19 
11 91 96 k 25 
13 109 114 m 11 
16 136 141 p 17 
17 145 150 q 18 
18 154 159 r 24 

[[4]] 
    start stop ID score 
5  37 42 e  9 
14 118 123 n  8 
15 127 132 o  7 
+0

私はあなたのアプローチを使用している場合とまったく同じ出力形式を得ることは可能ですか?私はexpand.gridを使用することは非常にスマートなことであり、おそらく私の期待される出力をもたらすと思います。しかし、どのように行列やdata.frameに出力を置くことができますか?私は同じ次元のベクトルをまとめることを望みます。どうもありがとうございました。 – user88911

+1

@ user88911この 'a < - a [order(a $ Var1)、]'のような順序付けられた 'a'を使用しますか? – Jimbou

+0

完璧な答え。あなたの大きな助けにもう一度お礼を言います。 – user88911

2

ジェフは何をしたいということですか?

outd <- function(ele_, li) base::setdiff(ele_, li) 
mapply(outd, a_new, tar.list, SIMPLIFY = FALSE) 

> mapply(outd, a_new, tar.list, SIMPLIFY = FALSE) 
$big 
    start stop ID score 
1  1 6 a 12 
6  46 51 f 20 
8  64 69 h 24 
9  73 78 i 13 
10 82 87 j 11 
12 100 105 l 19 
14 118 123 n 16 
15 127 132 o 18 
16 136 141 p 22 
17 145 150 q 23 
18 154 159 r 14 

$sml 
    start stop ID score 
2 10 15 b  9 
7 55 60 g 10 

編集

前のケースmapplyにはリストの要素のペアに関数を適用します。

我々は両方のリストを拡大するouterからideiaを取る場合は、我々は(他のケースで動作するかどうかわからない)を取得:

bY <- rep(tar.list, rep.int(length(a_new), length(tar.list))) 
bX <- rep(a_new, times = ceiling(length(bY)/length(a_new))) 
mapply(outd, bX, bY, SIMPLIFY = FALSE) 

> mapply(outd, bX, bY, SIMPLIFY = FALSE) 
$big 
    start stop ID score 
1  1 6 a 25 
2  10 15 b 23 
4  28 33 d 14 
7  55 60 g 19 
9  73 78 i 20 
10 82 87 j 21 
12 100 105 l 13 
13 109 114 m 12 
14 118 123 n 22 
16 136 141 p 15 
17 145 150 q 18 

$sml 
    start stop ID score 
6  46 51 f  9 
8  64 69 h  8 
18 154 159 r 10 

$big 
    start stop ID score 
1  1 6 a 25 
2  10 15 b 23 
4  28 33 d 14 
7  55 60 g 19 
9  73 78 i 20 
10 82 87 j 21 
12 100 105 l 13 
13 109 114 m 12 
14 118 123 n 22 
16 136 141 p 15 
17 145 150 q 18 

$sml 
    start stop ID score 
6  46 51 f  9 
8  64 69 h  8 
18 154 159 r 10 
+0

mapplyを使って、私がやったような出力の正しい次元を返さなかったのはなぜですか?どのようにmapplyを使用して起こることができますか?ありがとうございます – user88911

+0

追加編集を参照 – Robert

+0

ありがとうございました。 – user88911

関連する問題