如何在列表中对列表的子元素进行填充

时间:2012-11-24 18:31:31

标签: r apply lapply

假设我有一个嵌套在列表中的列表,我有一些只适用于向量的函数(比如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")

3 个答案:

答案 0 :(得分:6)

以下是如何使用申请。请注意应用定义中...的位置 - 这是在dflthow之后。出于这个原因,我们将参数命名为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