R цикл для создания фреймов данных с 2 счетчиками - PullRequest
0 голосов
/ 23 ноября 2018

Я хочу создать 60 фреймов данных по 500 строк в каждом.Я попробовал приведенный ниже код и, хотя у меня нет ошибок, я не получаю фреймы данных.Однако, когда я делаю View в as.data.frame, я получаю представление, но в моей среде нет фрейма данных.Я три дня пробовал разные версии этого кода:

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 голосов
/ 23 ноября 2018

Я не уверен, что описание соответствует коду, поэтому я немного не уверен, каков желаемый результат.Тем не менее, обычно бесполезно разбивать data.table, потому что встроенная побочная обработка делает его ненужным.Если по какой-то причине вы хотите разделить список на data.table s, вы можете рассмотреть что-то вроде

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)
0 голосов
/ 23 ноября 2018

Мы можем использовать 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))       

data

x <- data.table(ID = 1:50)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...