#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)