Запуск функций для всех файлов в каталоге и извлечение даты из файла имени

В R я хочу извлекать каждый файл csv в моем каталоге по одному в виде фреймов данных и вычислять сумму для каждого элемента.

Например, в Path / data у меня есть следующие 4 файла:

View_Mag_2018_03_01
View_Mag_2018_03_02
View_Mag_2018_03_03
View_Mag_2018_03_04

Каждый файл имеет фрейм данных, который выглядит примерно так:

          place         number
1         chamber1        1
2         chamber2        1 
3         chamber3        2 
4         chamber4        4
5         chamber1        1
6         chamber3        3

Я хотел бы создать 4 кадра данных (камера1, камера2, камера3, камера4) с для каждого кадра данных суммой по номеру для второго столбца и датой, извлеченной из имени файла csv для первого столбца:

Пример с камерой 1 df:

     date        sum
1  O1/03/2018     2

Пример с камерой 2 df:

     date        sum
1  O1/03/2018     1

И так далее для 4 созданных фреймов данных и так далее со всеми файлами каталогов, добавляя строку в эти 4 фрейма данных.

Спасибо за вашу помощь


person trayvou jba    schedule 15.03.2018    source источник
comment
Что вы пробовали и где застряли? Хотите привести воспроизводимый пример?   -  person Roman Luštrik    schedule 16.03.2018


Ответы (2)


сначала воспроизведем

df0 <- read.table(text="          place         number
1         chamber1        1
2         chamber2        1 
3         chamber3        2 
4         chamber4        4
5         chamber1        1
6         chamber3        3")

files <- c(
'View_Mag_2018_03_01',
'View_Mag_2018_03_02',
'View_Mag_2018_03_03',
'View_Mag_2018_03_04')

dir.create("Path/data",recursive = TRUE)
sapply(file.path("Path/data",files),write.csv,x=df0)

решение

мы читаем data.frames в списке, используя имена файла для добавления столбца даты.

dfs <- lapply(file.path(path,files),
              function(x) cbind(date=as.Date(substr(x,nchar(x)-9,nchar(x)),format="%Y_%m_%d"),
                                read.csv(x)))

Затем мы связываем все фреймы данных вместе

big_df <- do.call(rbind,dfs)

И суммируем, чтобы получить наш результат

agg <- aggregate(number ~ date +place,big_df,sum)
#          date    place number
# 1  2018-03-01 chamber1      2
# 2  2018-03-02 chamber1      2
# 3  2018-03-03 chamber1      2
# 4  2018-03-04 chamber1      2
# 5  2018-03-01 chamber2      1
# 6  2018-03-02 chamber2      1
# 7  2018-03-03 chamber2      1
# 8  2018-03-04 chamber2      1
# 9  2018-03-01 chamber3      5
# 10 2018-03-02 chamber3      5
# 11 2018-03-03 chamber3      5
# 12 2018-03-04 chamber3      5
# 13 2018-03-01 chamber4      4
# 14 2018-03-02 chamber4      4
# 15 2018-03-03 chamber4      4
# 16 2018-03-04 chamber4      4

Потом при желании можно разделить

splitdf <- split(agg,agg$place)
# $chamber1
# date    place number
# 1 2018-03-01 chamber1      2
# 2 2018-03-02 chamber1      2
# 3 2018-03-03 chamber1      2
# 4 2018-03-04 chamber1      2
# 
# $chamber2
# date    place number
# 5 2018-03-01 chamber2      1
# 6 2018-03-02 chamber2      1
# 7 2018-03-03 chamber2      1
# 8 2018-03-04 chamber2      1
# 
# $chamber3
# date    place number
# 9  2018-03-01 chamber3      5
# 10 2018-03-02 chamber3      5
# 11 2018-03-03 chamber3      5
# 12 2018-03-04 chamber3      5
# 
# $chamber4
# date    place number
# 13 2018-03-01 chamber4      4
# 14 2018-03-02 chamber4      4
# 15 2018-03-03 chamber4      4
# 16 2018-03-04 chamber4      4

Вы можете получить разные data.frames, используя assign с lapply, но, вероятно, не должны.

очистка

unlink(path)
person Moody_Mudskipper    schedule 15.03.2018
comment
Спасибо за этот ответ, он работает очень хорошо, я только что изменил read.csv на read.csv2, чтобы иметь свой большой заголовок. Во-вторых, файлы в формате XML из экспорта Excel в этом каталоге, поэтому как преобразовать их в формат csv (Мне пришлось вручную конвертировать по одному с помощью Excel)? - person trayvou jba; 16.03.2018
comment
отметьте xml2::read_xml, затем используйте write.csv. если у вас есть дополнительные вопросы, вам следует задать новый вопрос, так как он не имеет отношения к этому вопросу. - person Moody_Mudskipper; 16.03.2018

пытаться

# need the file vector (import with list.files)
files <- c("View_Mag_2018_03_01.csv",
"View_Mag_2018_03_02.csv",
"View_Mag_2018_03_03.csv",
"View_Mag_2018_03_04.csv")

чем мы преобразуем это как даты

library(tidyverse)
dates <- files %>%
  as_tibble() %>%
  separate(value, c("View", "Mag", "Y", "M", "D"), sep = "_") %>%
  select(Y, M, D) %>%
  unite(date, c("D", "M", "Y")) %>%
  mutate(date=as.Date(date,"%d_%m_%Y")) %>%
  as.data.frame()

теперь мы читаем все файлы и создаем мастер df

df <- NULL
for (i in seq_along(files)) {
  df[[i]] <- read_csv(files[i]) %>% select(place, number) %>% 
    group_by(place) %>%
    summarise(sum=sum(number)) %>%
    mutate(date=dates[i,1])
}
result <- bind_rows(df)

теперь мы разделились на 4 df

chamber1 <- result %>% filter(place=="chamber1") %>% select(date, sum)
chamber2 <- result %>% filter(place=="chamber2") %>% select(date, sum)
chamber3 <- result %>% filter(place=="chamber3") %>% select(date, sum)
chamber4 <- result %>% filter(place=="chamber4") %>% select(date, sum)

теперь у вас есть 4 камеры dfs. это должно сработать, дайте мне знать.

person Stephan    schedule 15.03.2018
comment
Спасибо за ваш ответ - person trayvou jba; 16.03.2018