迭代向量列表 - 如何与向量迭代结合

时间:2014-05-19 23:15:55

标签: r list for-loop vector lapply

我试图遍历一个向量列表来制作每个向量中元素的表。最简单的情况是考虑整个向量:

ls <- list(x = sample(LETTERS[1:5], 5,replace=T), 
    y = sample(LETTERS[1:5], 5, replace=T), 
    z=sample(LETTERS[1:5], 5, replace=T)
)

ls
$x
[1] "B" "A" "D" "A" "E"

$y
[1] "A" "D" "A" "D" "A"

$z
[1] "B" "C" "A" "E" "E"

lapply(ls, function(VEC) {table(factor(VEC, levels = LETTERS[1:5]))})
$x

A B C D E 
2 1 0 1 1 

$y

A B C D E 
3 0 0 2 0 

$z

A B C D E 
1 1 1 0 2 

但是当我尝试制作VEC子集的重叠表时,我得到了zilch:

lapply(ls, function(VEC) {
    for (i in 1:3) {
        table(factor(VEC[i:(i+2)], levels = LETTERS[1:5]))
    }
})

$x
NULL

$y
NULL

$z
NULL

我可以做些什么来为每个x,y和z获得3个表? (从VEC的1:3,2:4和3:5)? 谢谢!

1 个答案:

答案 0 :(得分:0)

好的,刚想出了一种可能的方法,虽然我不明白为什么我在没有-2的情况下运行以下内容时没有出现越界错误:

ls2<-lapply(ls, function(VEC) {
    lapply(1:(length(VEC)-2), function(S) {
        table(factor(VEC[S:(S+2)], levels = LETTERS[1:5]))
     })
})

ls2

$x
$x[[1]]

A B C D E 
1 1 0 1 0 

$x[[2]]

A B C D E 
2 0 0 1 0 

$x[[3]]

A B C D E 
1 0 0 1 1 


$y
$y[[1]]

A B C D E 
2 0 0 1 0 

$y[[2]]

A B C D E 
1 0 0 2 0 

$y[[3]]

A B C D E 
2 0 0 1 0 


$z
$z[[1]]

A B C D E 
1 1 1 0 0 

$z[[2]]

A B C D E 
1 0 1 0 1 

$z[[3]]

A B C D E 
1 0 0 0 2