R - создать таймсерию из имен файлов - PullRequest
0 голосов
/ 10 июля 2020

У меня 900 файлов с именами вроде 20120412_bwDD2yYa.txt. Первая часть до _ имеет формат год-месяц-день. В некоторые дни с ними связано несколько файлов.

Я хотел бы использовать даты, извлеченные из имен файлов, в качестве данных для компиляции временных рядов, где даты - это ось x, а количество файлов - ось y .

Как я могу это сделать?

Ответы [ 2 ]

5 голосов
/ 10 июля 2020

Вот решение с Base R. Поскольку вопрос не включает воспроизводимый пример, мы имитируем имена файлов, проанализируем даты и создадим счетчики по дате.

# use list.files() to extract files from directory
files <- list.files(path="./data",pattern="*.txt",full.names = FALSE)

# simulate result from list.files()
files <- c("20120101_aaa.txt","20120101_bbb.txt","20120102_ccc.txt")

# extract dates from file names 
date <- as.Date(substr(files,1,8),"%Y%m%d")

df <- data.frame(date,count = rep(1,length(date)))
aggregate(count ~ date,data = df, sum)

... и вывод:

        date count
1 2012-01-01     2
2 2012-01-02     1

dplyr solution

Решение с dplyr::summarise() выглядит так:

files <- list.files(path="./data",pattern="*.txt",full.names = FALSE)
# simulate result from list.files() 
files <- c("20120101_aaa.txt","20120101_bbb.txt","20120102_ccc.txt")
library(dplyr)
data.frame(date=as.Date(substr(files,1,8),"%Y%m%d")) %>% 
     group_by(date) %>% summarise(count = n())


# A tibble: 2 x 2
  date       count
  <date>     <int>
1 2012-01-01     2
2 2012-01-02     1

Учет дат без файлов

В ответ на комментарий к моему ответу, вот решение, которое заполняет пробелы в списке файлов, где есть дни с 0 файлами. Мы берем минимальную и максимальную даты из списка файлов и создаем фрейм данных, содержащий последовательность дат. Затем мы left_join() это с ранее агрегированными данными и перекодируем значения NA для count в 0.

# create a gap in dates with files
files <- c("20120101_aaa.txt","20120101_bbb.txt","20120102_ccc.txt",
           "20120104_aaa.txt","20120104_aab.txt","20120104_aac.txt")
library(dplyr)
data.frame(date=as.Date(substr(files,1,8),"%Y%m%d")) %>% 
     group_by(date) %>% summarise(count = n()) -> fileCounts
# create df with all dates, left_join() and recode NA to 0
data.frame(date = as.Date(min(fileCounts$date):max(fileCounts$date),
                                    origin = "1970-01-01")) %>%
     left_join(.,fileCounts) %>% 
     mutate(count = if_else(is.na(count),0,as.numeric(count)))

... и вывод:

Joining, by = "date"
        date count
1 2012-01-01     2
2 2012-01-02     1
3 2012-01-03     0
4 2012-01-04     3
1 голос
/ 10 июля 2020

Вы можете использовать table для подсчета частот, а затем stack для получения фрейма данных.

Использование @Len Greski files.

files <- c("20120101_aaa.txt","20120101_bbb.txt","20120102_ccc.txt")
stack(table(as.Date(sub('_.*', '', files),"%Y%m%d")))[2:1]

#         ind values
#1 2012-01-01      2
#2 2012-01-02      1
...