R: вложенный цикл, расширяющий фрейм данных новыми наблюдениями - PullRequest
0 голосов
/ 12 ноября 2018

Невозможно найти решение моей проблемы.

У меня есть набор данных .txt файлов, названный в честь времени их наблюдения, например: 2018-07-04-04-53.txt. Все эти .txt-файлы хранятся в одной папке.

Моя цель - создать новый data.frame, содержащий информацию из этих файлов .txt.

Сначала я собираю имена файлов в папке:

nam = list.files(path = "C:/Users/.../data")

Затем я создаю вектор, содержащий целые числа от 1: длина переменной

nrv = c(1:length(nam))

После этого я готовлю свой «фиктивный» data.frame, который я хочу заполнить следующими вложенными циклами. (Я пытался заполнить data.frame с помощью rbind, но он всегда удалял драгоценно заполненные данные)

nrnam = length(nam)


data = data.frame("year"=c(1:nrnam), "month"=c(1:nrnam), "day"=c(1:nrnam), "hour"=c(1:nrnam), "min"=c(1:nrnam))

Идея заключается в том, чтобы создать df, похожую на матрицу, но с заголовком (мои исходные входные данные сильно сжаты, так как их необходимо транспортировать через iridium)

Это цикл for, который я пытался использовать, чтобы заполнить правильные даты наблюдения.

 for (i in nam) {

  for (ii in nrv) {

  # Einlesen des Datums aus dem Namen der Datei


  yr = substr(i,1,4)
  mo = substr(i,6,7)
  da = substr(i,9,10)
  hr = substr(i,12,13)
  mn = substr(i,15,16)

  data$year[ii] = yr
  data$month[ii] = mo
  data$day[ii] = da
  data$hour[ii] = hr
  data$min [ii] = mn


  } 
}

Как пример для вас, ребята: «i» содержит 41 символ (2018-07-04-04-53.txt до 2018-07-12-10-51.txt), «ii» - это 41 файл в итого, поэтому nrnam должно быть целым числом 1: 41.

Моя основная идея была:

1) go to file 1 (here 2018-07-04-04-53.txt) 
2) gather the observation date from file name
3) place it at row [ii] in my df. 
4) do it for all 41 files... 

Моя проблема: цикл заполняет правильную дату из последнего файла .txt для всех 41 строки. Так что все одинаково.

Заранее большое спасибо за помощь!

1 Ответ

0 голосов
/ 12 ноября 2018

Попробуйте что-то вроде этого:

setwd("U:/Playground/StackO/")

df <- data.frame(files = list.files())

library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following object is masked from 'package:base':
#> 
#>     date

df$date <- ymd_hm(df$files)  
df$month <- month(df$date)

df
#>                  files                date month
#> 1 2018-07-04-04-53.txt 2018-07-04 04:53:00     7
#> 2 2018-07-06-11-51.txt 2018-07-06 11:51:00     7
#> 3 2018-07-12-10-51.txt 2018-07-12 10:51:00     7

lubridate - это пакет, который используется для манипулирования датами. Это значительно упрощает рабочий процесс, поскольку вам не нужно создавать свои собственные функции и думать о крайних случаях.

Вы все еще можете использовать свой путь так: df $ month2 <- substr (df $ files, 6,7) </p>

df
#>                  files                date month month2
#> 1 2018-07-04-04-53.txt 2018-07-04 04:53:00     7     07
#> 2 2018-07-06-11-51.txt 2018-07-06 11:51:00     7     07
#> 3 2018-07-12-10-51.txt 2018-07-12 10:51:00     7     07
...