R循环创建带有2个计数器的数据帧

时间:2018-11-23 17:44:51

标签: r loops dataframe for-loop

我要创建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)

2 个答案:

答案 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)