【问题标题】:Iteration through list of vectors - how to combine with vector iteration遍历向量列表 - 如何与向量迭代相结合
【发布时间】:2014-05-19 23:15:54
【问题描述】:

我正在尝试遍历向量列表以制作每个向量中的元素表。最简单的情况是考虑整个向量:

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)? 谢谢!

【问题讨论】:

  • 使用与基本 R 函数相对应的变量名称通常不是一个好主意。在这种情况下,ls 通常会返回您环境中的所有变量名。
  • 另外,您的 for 循环解决方案不起作用,因为 for 循环实际上并没有返回任何内容。你打电话给table 三次,但他们哪儿也不去。你的函数没有返回值。
  • 我同意@MrFlick 的观点,尽管 R 能够区分函数和“数据”。这更多的是人类可读性问题。
  • 是的,我明白了。谢谢你们!

标签: r list for-loop vector lapply


【解决方案1】:

好的,只是想出了一种可能的方法,尽管我不明白为什么在没有 -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 

【讨论】:

  • 越界错误是因为列表中每个元素的 VEC 长度为 5。如果你让S 从 1 到 5,那么范围 S:(S+2) 可能会上升到 5:7,并且没有元素 6 和 7,因此会出现越界错误。
  • 嗯,这正是我所期望的,但它不会发生!我可以让 S 达到 100,并且不会出错...
  • 对不起,我看错了。这是正确的。 R 将允许您为向量指定任何索引,如果它尚不存在,它只会返回 NA 并且表通常会忽略 NA,除非您得到 useNA="ifany"useNA="always"
  • 啊,好的!这是有道理的,我的期望是错误的。谢谢!
  • 是的,因为 for 循环没有任何类型的返回值。因此,他/她传递给lapply 的函数没有返回任何内容。在这里,您提供给lappy 的函数具有table() 作为它的最后一次调用,因此它返回该结果表。你的函数有一个返回值。
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多