R write.table в for цикл - пропустить первую итерацию - PullRequest
1 голос
/ 18 октября 2019

Я пытаюсь прочитать большой набор данных, состоящий из 1000 наблюдений, затем разделить его по годам и записать .csv для каждого года. Первый цикл for считывает данные, удаляет ненужные переменные и переименовывает столбцы. Второй цикл for говорит: if i == 1 написать таблицу, все остальные итерации добавляют эту таблицу. Когда я запускаю это вне внешнего цикла, он работает нормально. Тем не менее, когда я запускаю всю вещь, нужные файлы .csv (например, «test_data_year_2004.csv») не содержат наблюдений с первой итерации. Кроме того, он записывает файлы .csv, "test_data_year_4.csv", "test_data_year_5.csv" и т. Д. Кажется, что нежелательные имена .csv являются последней цифрой моего вектора "years". Они содержат только заголовки столбцов. Я не уверен, что является причиной этой ошибки. У меня есть догадка, что это вектор "лет". Я постараюсь преобразовать вектор в строку рядом, чтобы увидеть, работает ли цикл по as.character () лучше. Тем не менее, я заметил, что нет никакого потока, связанного с этой проблемой, поэтому я подумал, что не мешало бы создать его и посмотреть другие возможные способы обработки. Ниже мой код.

for(i in 1:1000){

  # Sequence to read 1000 rows every iteration and then skip rows that are read
  # Will read in total 1M observations 
  nrow <- (i-1)+(1000-(i-1))
  skip <- 1000*(i-1)

  print(paste("read =", nrow, "skip =", skip))

  # Will throw error when out of lines to read 
  data <- read.csv(paste(import.path, "test_data.csv", sep = ""), header = F, nrows = nrow, skip = skip )

  # Set variables to keep
  myvars <- names(data)[c(1:3, 6)]
  data <- data[myvars]

  # Rename
  colnames(data) <- c("hhid", "xcoord", "ycoord", "saleyear")

  # Subset data based on years - will have to iterate
  years <- unique(data$saleyear)
  # Drop first observation - it is variable name 
  years <- years[-1]
  years <- sort(years)

  for(j in as.numeric(years)){
    data.export <- filter(data, data$saleyear == j)

    if(i == 1){
      # Write initial file 
      write.table(data.export, paste(export.path, "test_data_year_", j, ".csv", sep = ""), append = F, row.names = F, sep = ",", col.names = T)
    } else {

      # Append
      write.table(data.export, paste(export.path, "test_data_year_", j, ".csv", sep = ""), append = T, row.names = F, sep = ",", col.names = F)
    }
  }
}
...