假设我有一个嵌套在列表中的列表,我有一些只适用于向量的函数(比如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")
答案 0 :(得分:6)
以下是如何使用申请。请注意应用定义中...的位置 - 这是在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"
答案 1 :(得分: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"
我相信这非常有效,但尚未经过测试。
答案 2 :(得分:2)
rapply
以递归方式将函数应用于每个列表元素。您可能需要尝试使用参数how
来获得正确的输出,但它应该可以满足您的需求。
rapply
文档为here。