2016-11-28 29 views
0

は、例えば、以下の3は、(ベクトルがリストに保存されているように、この例では、できるだけ単純である)取り出すことができ、あなたは機能のための可能な引数としてリストの未定義のNRを持っていると仮定しますmapply複数の未定義の引数

私はすべての3つのリストの共通部分を計算したい場合は
a <- list(c(1,2,3,4,5)) 
b <- list(c(3,6,7,2,1)) 
c <- list(c(3,9,8)) 

、次のようにこれを行うことができます。

Map(intersect,c,Map(intersect,a,b)) 
# or equivalent: 
mapply(intersect,c,mapply(intersect,a,b,SIMPLIFY=F)) 
# [1] 3 

をしかし、どのように、私は未定義れる引数のNRを変更できますか?私は...について読んでいますが、うまく動作しません。

intersectio <- function(...){ 
    Map(function(...){ 
    intersect(...) 
    }) 
} 

Q:最初のアイデアは...によって定義された複数のリスト引数を持つことができる機能を、書くことでした。しかし交差を再帰的に適用されなければならないので、それは、もちろん動作しません。 Rでこれを達成する方法はありますか?

Q2:入れ子構造のリスト構造を持つ更新された例です。この場合、どのようにすることができますか?つまり、親リストのすべてのサブリストと、他の親リストの関連するサブリスト(同じインデックス)と交差しますか?

a <- list(list(c(1,2,3,4,5)),list(c(3,6,7,2,1)),list(c(3,9,8))) 
b <- list(list(c(1,2)),list(c(3,6,9,11,12)),list(c(3))) 
c <- list(list(c(1,9)),list(c(65,23,12)),list(c(14,15))) 
+2

'ヘルプ( "削減")' – Roland

+0

はintersectio < - 機能(...){(交差、...)を低減}のいずれかに動作しません。さらに、私の議論は実際にはネストされたリストであり、上記のようにリストの単純なベクトルではありません。だからReduceを適用するだけで簡単ではありません... – user3032689

+2

'関数(x、y)マップ(交差、x、y)、リスト(a、b、c))'を減らしてもいいですか?あなたは代表的な再現可能な例を提供する必要があります。 – Roland

答えて

2

@Rolandは、Reduceを使用して問題を解決できます。 (質問の最初のバージョンのように)フラットリストの場合は、次を使用することができます。

Reduce(intersect, c(a, b, c)) 

(更新問題のような)ネストされたリストの場合は、あなただけのラップすることができますそのmapplyコールの内側:

mapply(function(...) Reduce(intersect, c(...)), a, b, c) 

一般化するには、関数を定義することができ、その後、あなたが好きなだけの引数でそれを呼び出します。

list_intersect <- function(...){ 
    mapply(function(...) Reduce(intersect, c(...)), ...) 
} 
list_intersect(a, b, c) 
+0

非常に良い。ちょうどもう一つ:ここでa、b、cのためにそれを行います。定義されていない議論のためにそれを一般化したい場合、ソリューションはどのように見えるでしょうか?私は単にa、b、cを '...'で置き換えることはできません。 – user3032689