#r #loops #dplyr
#r #циклы #dplyr
Вопрос:
Итак, у меня есть папка с файлами Excel, все одинаковые по формату. Вот упрощенная версия того, с чем я работаю:
country count year
USA 23232 2019
USA 3993 2019
RUSSIA 67574 2019
JAPAN 31 2019
JAPAN 535 2019
Поэтому я хотел бы сделать следующее с каждым файлом в моей папке
df %>%
group_by(country, year) %>%
summarize(count = sum(count))
В одном файле это будет выглядеть так:
country year count
1 JAPAN 2019 566
2 RUSSIA 2019 67574
3 USA 2019 27225
Итак, как я могу сделать это для каждого файла в моей папке, опять же, они идентичны. Конечной целью будет один фрейм данных со всеми данными о количестве файлов в нем. Предпочтительный вариант Tidyverse
Комментарии:
1. можете ли вы привести пример своей структуры каталогов в своем вопросе?
Ответ №1:
Этот код может быть полезен. Вы создаете функцию, которая считывает файл Excel (я использовал sheet = 1
, но вы можете изменить его). После этого вы обрабатываете и присваиваете ключевой переменной имя файла. Затем вы создаете список для выполнения процесса и, наконец, связываете содержимое с помощью bind_rows()
. Здесь код:
library(readxl)
library(dplyr)
#Extract files
vec <- list.files(path = 'Your/Path/Here',pattern = '.xlsx')
#Function
readprocess <- function(x)
{
y <- read_excel(x,1)
z <- y %>%
group_by(country, year) %>%
summarize(count = sum(count)) %>% mutate(Filename=x)
return(z)
}
#Apply
List <- lapply(vec,readprocess)
#Bind
df <- do.call(bind_rows,List)
Ответ №2:
folder_path <- "insert_path_here"
files <- list.files(path=folder_path)
results <- lapply(files, function(x) {
df <- read.csv(paste0(folder_path, "/", x))
df <- df %>%
group_by(country, year) %>%
summarize(count = sum(count))
}
)
df_results <- do.call(bind_rows, results)
В качестве альтернативы, вы могли бы просто определить свои файлы в список вручную, но суть в том, что скрипт будет:
- Просмотрите каждый файл в этом списке и для каждого файла:
- Читать в электронной таблице
- Выполнять манипуляции с данными
- Связывает все результаты в фрейм данных