通过取消列表将矢量化函数应用于列表,然后重新列出

时间:2013-04-30 21:20:10

标签: r list vectorization

假设您有一个字符向量列表:

set.seed(42)
x <- lapply(sample(10:50), function(x) {
  sapply(1:x, function(y) {
    paste(sapply(y, sample, x=letters, size=sample(5:10, 1)), collapse='')
  })
})

您希望在整个列表中应用矢量化操作。一个选项是unlist(x),然后应用矢量化函数:

y <- nchar(unlist(x))

y恢复为与x相同的列表结构的最有效方法是什么?有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:4)

另一种方法是使用as.relistablerelist这样的函数:

y <- as.relistable(x)
z <- nchar( unlist(x) )
z <- relist(z,y)
str(head(z))
#List of 6
# $ : int [1:47] 7 8 6 6 6 5 8 10 10 5 ...
# $ : int [1:50] 7 9 9 6 7 10 7 6 10 8 ...
# $ : int [1:21] 8 7 9 5 9 10 5 5 8 9 ...
# $ : int [1:41] 5 9 9 9 5 5 5 5 10 9 ...
# $ : int [1:33] 9 5 9 9 8 9 7 9 6 10 ...
# $ : int [1:28] 5 5 5 9 8 8 8 6 9 6 ...

答案 1 :(得分:2)

我很难理解为什么lapply不是答案(以及为什么Josh删除了他在6小时之前准确说出的答案。)

charcounts <- lapply(x, nchar )
str(head(charcounts))
List of 6
 $ : int [1:47] 7 8 6 6 6 5 8 10 10 5 ...
 $ : int [1:50] 7 9 9 6 7 10 7 6 10 8 ...
 $ : int [1:21] 8 7 9 5 9 10 5 5 8 9 ...
 $ : int [1:41] 5 9 9 9 5 5 5 5 10 9 ...
 $ : int [1:33] 9 5 9 9 8 9 7 9 6 10 ...
 $ : int [1:28] 5 5 5 9 8 8 8 6 9 6 ...