【发布时间】:2018-11-13 01:54:29
【问题描述】:
我有一个 列表列表,其中包含 data.frames,我想从中只选择几行。我可以在 for 循环中实现它,在该循环中,我根据行数创建一个序列,并根据该序列仅选择行索引。
但如果我有更深的嵌套列表,它就不再起作用了。我也确信,没有循环有更好的方法。
什么是从嵌套列表中采样的有效且通用的方法,它们的维度不同并包含 data.frames 或矩阵?
## Dummy Data
n1=100;n2=300;n3=100
crdOrig <- list(
list(data.frame(x = runif(n1,10,20), y = runif(n1,40,60))),
list(data.frame(x = runif(n2,10,20), y = runif(n2,40,60))),
list(data.frame(x = runif(n3,10,20), y = runif(n3,40,60)))
)
## Code to opimize
FiltRef <- list()
filterBy = 10
for (r in 1:length(crdOrig)) {
tmp <- do.call(rbind, crdOrig[[r]])
filterInd <- seq(1,nrow(tmp), by = filterBy)
FiltRef[[r]] <- tmp[filterInd,]
}
crdResult <- do.call(rbind, FiltRef)
# Plotting
crdOrigPl <- do.call(rbind, unlist(crdOrig, recursive = F))
plot(crdOrigPl[,1], crdOrigPl[,2], col="red", pch=20)
points(crdResult[,1], crdResult[,2], col="green", pch=20)
如果列表包含多个 data.frames(下面的数据),上面的代码也可以工作。
## Dummy Data (Multiple DF)
crdOrig <- list(
list(data.frame(x = runif(n1,10,20), y = runif(n1,40,60)),
data.frame(x = runif(n1,10,20), y = runif(n1,40,60))),
list(data.frame(x = runif(n2,10,20), y = runif(n2,40,60))),
list(data.frame(x = runif(n3,10,20), y = runif(n3,40,60)))
)
但如果一个列表包含多个列表,则尝试将结果 (FiltRef) 绑定在一起时会引发错误。
结果可以是具有 2 列 (x,y) 的 data.frame - 像 crdResult 或像 FiltRef 的一维列表(来自第一个示例)
## Dummy Data (Multiple Lists)
crdOrig <- list(
list(list(data.frame(x = runif(n1,10,20), y = runif(n1,40,60))),
list(data.frame(x = runif(n1,10,20), y = runif(n1,40,60)))),
list(data.frame(x = runif(n2,10,20), y = runif(n2,40,60))),
list(data.frame(x = runif(n3,10,20), y = runif(n3,40,60)))
)
+1 并感谢大家的精彩回答!他们都工作,每个人都有很多东西要学习。我会把这个交给@Gwang-Jin Kim,因为他的解决方案是最灵活和广泛的,尽管它们都值得检查!
【问题讨论】:
-
请提供最后一个示例的预期输出。
-
你想要一个等长的列表对象列表吗?那么对于最后一个例子,第一个嵌套列表应该重新绑定在一起吗?
-
我添加了预期的结果,但是它也可以是一维列表,并且可以重新绑定第一个嵌套列表。
标签: r performance nested lapply