Как загрузить несколько файлов из папки и использовать часть имени файла в качестве столбца в наборе данных - PullRequest
2 голосов
/ 03 марта 2020

Я медленно перебираю R и много учусь благодаря таким форумам и блогам. Я нашел удобный фрагмент кода (ниже), чтобы решить часть новой проблемы, но теперь я застрял.

library(readr)
library(dplyr)

myFiles <- list.files(path = "C:/Desktop/M2P/", pattern = "*.txt", full.names = FALSE)
myTable <- sapply(myFiles, read_csv, simplify=FALSE) %>% 
  bind_rows(.id = "id")

Все имена файлов в пути похожи на это: 'YYYYMMDD_SUMMARY.txt'

Файл содержит несколько столбцов, разделенных ","

Приведенный выше код добавляет в таблицу новый столбец ("id") с точным именем файла, который был загружен, вместе со всеми мои данные в столбцах, и это здорово, однако ...

Я хотел бы изменить это так, чтобы я добавил столбец, который является только частью даты имени файла, то есть , ГГГГ-ММ-ДД . Я хочу использовать эту дату позже, чтобы использовать некоторые функции и сгруппировать данные.

возможно ли это?

Ответы [ 3 ]

1 голос
/ 03 марта 2020

Добавьте оператор mutate, чтобы получить дату из имен файлов.

library(dplyr)
library(readr)

sapply(myFiles, read_csv, simplify=FALSE) %>% 
   bind_rows(.id = "id") %>%
   mutate(id = sub('(\\d+).*', '\\1', id))
   #If you need as date object
   #mutate(id = lubridate::ymd(sub('(\\d+).*', '\\1', id)))
0 голосов
/ 03 марта 2020

Вот подход data.table вещей. Поскольку вы только начинаете с R, это может показаться немного пугающим, но я настоятельно рекомендую взглянуть на этот пакет ...

Объяснение и промежуточный вывод прокомментирован в следующем коде ..

-

Допустим, у меня есть два файла в подпапке "temp", например:

enter image description here

с таким содержанием:

enter image description here

#get a list of all *full* filenames in the folder ./temp, ending on the pattern ".txt" 
files.to.read <- list.files( path = "./temp", pattern = ".*.\\.txt$", full.names = TRUE )
#[1] "./temp/20200302_SUMMARY.txt" "./temp/20200303_SUMMARY.txt"

#load data.table library
library( data.table )
#create a list, reading the files from the above created list
#fread() from the data.table package is a fast and robust reader, with many, many options.
l <- lapply( files.to.read, fread )
# [[1]]
# col1 col2
# 1:    6    9
# 
# [[2]]
# col1 col2
# 1:    1    4

#now, add names to the list, based on the read filenames 
#do this by removing all non digit-charactes (regex = "[^0-9]" ) from the filename (=basename)
names(l) <- gsub( "[^0-9]", "", basename(files.to.read) )

#as you can see, the dates are now the namse of the list l

# $`20200302`
# col1 col2
# 1:    6    9
# 
# $`20200303`
# col1 col2
# 1:    1    4

#now use rbindlist from the data.table package to rowbind the list together
#use the names from the list as id in a new column, named "date"
rbindlist( l, idcol = "date" )

конечный вывод

#        date col1 col2
# 1: 20200302    6    9
# 2: 20200303    1    4
0 голосов
/ 03 марта 2020

Другой способ - использовать separate из tidyr, чтобы разделить id на дату и остаток:

library(dplyr)
library(tidyr)

df <- tibble(id = c("20110101_SUMMARY", "20110201_SUMMARY", "20110301_SUMMARY"), x = runif(3), y = runif(3))
df %>% 
  separate(id, into = c("date", "desc")) %>% 
  mutate(date = as.Date(date, "%Y%m%d"))
...