考虑以下结构的矩阵列表
m1 <- matrix(floor(runif(156,min=0, max=10)), ncol=12)
m2 <- matrix(floor(runif(120,min=0, max=10)), ncol=12)
m3 <- matrix(floor(runif(120,min=0, max=10)), ncol=12)
m4 <- matrix(floor(runif(204,min=0, max=10)), ncol=12)
l1<-list(m1,m2,m3,m4)
如何恢复所有列出的矩阵中的范围列表?我知道一个有效的解决方案,如下例所示:
lapply(l1, function(x)x[,seq(1,12,2)])
但我是R的新手并且很难找到索引列表。任何人都可以用新手条款解释和/或提供替代解决方案吗?在分析我的数据时,我经常陷入类似的情况,并且浪费了很长时间。提前谢谢。
答案 0 :(得分:3)
我会通过写下来让你的代码更清晰:
lapply(l1, function(x) {
x[,c(TRUE, FALSE)]
}
那发生了什么?您将列表:l1
并传递给lapply
。 lapply
将列表分解为列表项,并将每个列表迭代地传递给您在lapply
的第二个参数中定义的函数。此函数只有一个参数x
,它将成为列表l1
中的单个项目。这些部分:x
现在可以由函数中的代码处理。您希望从这些矩阵中提取每个第二列,因此您可以在该矩阵x中索引第1,第3,第5列等。
x的索引本身是[row, column]
,因此您可以通过在逗号之后指定c(TRUE, FALSE)
之前在逗号和一些列之前指定任何内容来要求所有行。向量c(TRUE, FALSE)
的重复次数与矩阵中的列数一样长,因此您不必使用:seq(1, 12, 2)
来获取所需的索引。
在我看来,没有其他明显的解决方案,你已经自己指定了最好的解决方案:)