我要创建60个数据帧,每个帧有500行。我尝试了下面的代码,尽管没有错误,但没有得到数据帧。但是,当我在as.data.frame上执行View时,得到的是视图,但我的环境中没有数据框。我已经尝试了三天的这段代码的各种版本:
getDS <- function(x){
for(i in 1:3){
for(j in 1:30000){
ID_i <- data.table(x$ID[j: (j+500)])
}
}
as.data.frame(ID_i)
}
getDS(DATASETNAME)
答案 0 :(得分:2)
我们可以使用outer
(在一个小例子中)
out1 <- c(outer(1:3, 1:3, Vectorize(function(i, j) list(x$ID[j:(j + 5)]))))
lapply(out1, as.data.table)
-
OP函数的问题在于,在循环内部,ID_i
每次都被更新,即不被存储。为此,我们可以初始化list
,然后将其存储
getDS <- function(x) {
ID_i <- vector('list', 3)
for(i in 1:3) {
for(j in 1:3) {
ID_i[[i]][[j]] <- data.table(x$ID[j:(j + 5)])
}
}
ID_i
}
do.call(c, getDS(x))
x <- data.table(ID = 1:50)
答案 1 :(得分:1)
我不确定说明是否与代码匹配,因此我不确定所希望的结果是什么。也就是说,拆分data.table
通常没有帮助,因为内置的副处理使其不必要。如果出于某些原因您确实想分割成data.table
的列表,则可以考虑
getDS <- function(x, n=5, size = nrow(x)/n, column = "ID", reps = 3) {
x <- x[1:(n*size), ..column]
index <- rep(1:n, each = size)
replicate(reps, split(x, index),
simplify = FALSE)
}
getDS(data.table(ID = 1:20), n = 5)