7

リスト内にネストされたリストがあり、ベクトルでのみ機能する関数があるとします (stringr パッケージの str_replace など)。関数は、実際に情報を伴うすべての要素に対して作業を行う必要があります...

質問 1:私の問題に対する特定の解決策はありますか?
質問 2:一般的な解決策はありますか?

ループを使用した解決策があるはずですが、それはエレガントではなく、おそらく非常に遅いです.ここでは効率が重要です.

を見てみましょう:

# let's start easy:
test1 <- list(c("a","d"),c("b","d"),c("c","d"))

# does not work:
str_replace(test1,"d","changed")

# but this does:
lapply(test1,str_replace,"d","changed")

# but what now ?
test2 <- list(c(list("a"),"d"),c("b","d"),c("c","d"))

# does not work! :-(
lapply(test2,str_replace,"d","changed")
4

3 に答える 3

7

これにraplyを使用する方法は次のとおりです。rapply の定義における ... の位置に注意してください。これは and の後にdfltありhowます。このため、引数に str_replace の名前を付けます。

rapply(test,str_replace,pattern="d",replacement="changed",how='replace')

[[1]]
[[1]][[1]]
[1] "a"

[[1]][[2]]
[1] "changed"


[[2]]
[1] "b"       "changed"

[[3]]
[1] "c"       "changed"
于 2012-11-24T18:57:29.703 に答える
3

unlist/を使用できますrelist

library(stringr)
test <- list(c(list("a"),"d"),c("b","d"),c("c","d"))
test2 <- unlist(test)
test2 <- str_replace(test2,"d","changed")
relist(test2,test)

[[1]]
[[1]][[1]]
[1] "a"

[[1]][[2]]
[1] "changed"


[[2]]
[1] "b"       "changed"

[[3]]
[1] "c"       "changed"

これはかなり効率的だと思いますが、テストしていません。

于 2012-11-24T18:57:00.473 に答える
2

rapply各リスト要素に関数を再帰的に適用します。正しい出力を得るには、パラメーターを試しhowてみる必要があるかもしれませんが、必要なものが得られるはずです。

rapplyドキュメントはこちらです。

于 2012-11-24T18:53:06.203 に答える