Можно ли скомпилировать столбец данных из нескольких файлов .csv (хранящихся в одной папке) в один столбец?

#r #data-manipulation

Вопрос:

Я хотел бы взять некоторые столбцы из нескольких (множества!) файлов .csv и создать новый файл .csv со всеми столбцами, сложенными в стопку. Все файлы .csv находятся в одной папке и почти идентичны, за исключением одного столбца данных. Большинство столбцов должны оставаться точно такими же, но один новый столбец должен быть сгенерирован из имени в заголовке одного из столбцов (это единственный заголовок, который будет меняться), и я хотел бы удалить некоторые столбцы ненужных данных. Вот пример того, что я хотел бы, чтобы произошло, но упрощенный только до двух наборов данных:

 Data set 1
   X        date distance.code location.code Time1     unneeded.data
   1 2021/05/18             C          BSF1 0.715               999
   2 2021/05/18            30          BSF1 0.896               999
   3 2021/05/18            60          BSF1 0.803               999
   4 2021/05/18           120          BSF1 0.705               999
   5 2021/05/18             C          BSG1 0.563               999
   6 2021/05/18             C          BSG1 0.961               999
   7 2021/05/18            30          BSG1 0.833               999
   8 2021/05/18            60          BSG1 0.894               999
 
data set 2                                                                        
  X       date distance.code location.code  Time2     unneeded data
  1 2021/05/18             C          BSF1 0.806               999
  2 2021/05/18            30          BSF1 0.878               999
  3 2021/05/18            60          BSF1 0.625               999
  4 2021/05/18           120          BSF1 0.609               999
  5 2021/05/18             C          BSG1 0.766               999
  6 2021/05/18             C          BSG1 0.846               999
  7 2021/05/18            30          BSG1 0.856               999
  8 2021/05/18            60          BSG1 0.698               999

Combined datasets (this is what I want)                                                                           
  X       date distance.code location.code        timeperiod   Values
  1 2021/05/18             C          BSF1             Time1 0.715
  2 2021/05/18            30          BSF1             Time1 0.896
  3 2021/05/18            60          BSF1             Time1 0.803
  4 2021/05/18           120          BSF1             Time1 0.705
  5 2021/05/18             C          BSG1             Time1 0.563
  6 2021/05/18             C          BSG1             Time1 0.961
  7 2021/05/18            30          BSG1             Time1 0.833
  8 2021/05/18            60          BSG1             Time1 0.894
  1 2021/05/18             C          BSF1             Time2 0.806
  2 2021/05/18            30          BSF1             Time2 0.878
  3 2021/05/18            60          BSF1             Time2 0.625
  4 2021/05/18           120          BSF1             Time2 0.609
  5 2021/05/18             C          BSG1             Time2 0.766
  6 2021/05/18             C          BSG1             Time2 0.846
  7 2021/05/18            30          BSG1             Time2 0.856
  8 2021/05/18            60          BSG1             Time2 0.698 
 

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

 temp <- list.files(pattern="*.csv")
myfiles = lapply(temp,read.csv)

df <- do.call(rbind, myfiles)
 

Это не сработало, но, похоже, так и должно быть.Кроме того, это даже не сделало бы все, что я хочу, но я не был уверен, как получить новый столбец с уникальными временными кодами. Я думаю, что это может быть грязный способ сделать это, и я ожидаю, что есть более элегантное решение. Спасибо за любую помощь.

Ответ №1:

Вы можете select указать необходимые столбцы в окончательных данных и получить данные в длинном формате с помощью pivot_longer . С помощью map_df вы можете объединить список в один кадр данных.

 library(dplyr)
library(purrr)

temp <- list.files(pattern="*.csv")
myfiles = lapply(temp,read.csv)

cols_to_keep <- c('X', 'date','distance.code', 'location.code')

combine_data <- map_df(myfiles, ~.x %>% 
      select(all_of(cols_to_keep), starts_with('Time')) %>%
      pivot_longer(cols = starts_with('Time'), 
                   names_to = 'timeperiod', 
                   values_to = 'Values'))
 

Комментарии:

1. Это сработало идеально! Похоже pivot_longer , что функция является частью tidyr, поэтому мне просто нужно было включить эту библиотеку. Спасибо за вашу помощь!!

2. Кто-нибудь знает, почему это могло перестать работать. Я использовал этот код раньше для одного набора данных, затем переключился на другой идентичный набор данных, но теперь я получаю сообщение об ошибке: «Ошибка: cols необходимо выбрать хотя бы один столбец». Кто-нибудь знает, почему это могло произойти?

Ответ №2:

Я думаю, вам следует использовать bind_rows из dplyr пакета:

 library(dplyr)
df <- bind_rows(myfiles)