Действительно @MartinMorgan, хороший момент! Я попал в сорняки и не мог этого увидеть.
я естьсписок списков, содержащий 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
) все вместе.
Результатом может быть data.frame с двумя столбцами (x, y) - как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, поскольку его решение является наиболее гибким и обширным, хотя все они заслуживают проверки!