假设我有一个嵌套在列表中的列表,我有一些只适用于向量的函数(比如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")
Run Code Online (Sandbox Code Playgroud)
以下是如何使用rapply.注意...在rapply的定义中的位置 - 这是在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"
Run Code Online (Sandbox Code Playgroud)
您可以使用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"
Run Code Online (Sandbox Code Playgroud)
我相信这非常有效,但尚未测试。