リスト内のリストに関数を適用したいのですが。第2レベルのリストは、任意の数の文字列で構成されます(そのため、何かが足りない場合は、リスト内のリストのデータ構造が最も適切です)。これを行う最も効率的な方法を知りたいのですが。これは私がループで望むことを達成する簡単な例です:
#sample data
set.seed(12345)
mylist <- list()
mylist[[1]] <- list(sample(letters,3),sample(letters,4),sample(letters,5))
mylist[[2]] <- list(sample(letters,4),sample(letters,5))
mylist[[3]] <- list(sample(letters,5),sample(letters,3),sample(letters,4),sample(letters,2)
#working loop example
result <- list()
for(i in 1:length(mylist)){
result[[i]] <- lapply(mylist[[i]],function(x,l) 0 + (l %in% x),l=letters)
}
このループを1行のソリューションに変える簡単な方法はありますか?
これのより広い文脈はresult
、たとえば(この単純なケースでは)各文字がiで発生する回数、またはの元の次元を取得するために合計することによって、データをさらに削減したいということですmylist
。したがって、最終的な目標は次のようになります。
final.result <- lapply(result,Reduce,f='+')
したがって、別の方法として、関数を単純に適用してからunlist(mylist)
、i情報を結果のデータ構造に復元することもできます...これは私にはもっと複雑に思えますが、私は提案を受け入れています。
recursive ?rapply
with引数how='list'
を使用してリスト構造を保持し、ラップReduce
して最終結果を取得できます。
lapply(rapply(mylist,function(x) letters %in% x + 0, how='list'), Reduce, f='+')
letters
ボーベル大佐が指摘したように、あなたの機能は短くすることができます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加