R: Объединение фреймов данных на основе имени файла

#r #csv

#r #csv

Вопрос:

Мои файлы (например, у меня есть сотни таких файлов):

 France.csv
France_variables.csv
Germany.csv
Germany_variables.csv
Spain.csv
Spain_variables.csv
Portugal.csv
Portugal_variables.csv
  

Я хочу объединить Францию с France_variables, Германию с Germany_variables и т.д. Я знаю, что могу использовать rbind с двумя файлами, но я хочу сделать это как цикл, потому что у меня их много для объединения. Я не уверен, как выполнить поиск по строке, а затем выполнить повторную привязку в цикле или есть ли лучший способ сделать это.

Я новичок в R, поэтому буду признателен за любую помощь.

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

1. Что вы имеете в виду под merge ?

2. добавьте данные из France.csv во France_variables.csv

3. Вы хотите разные df для каждой страны? или вы хотите, чтобы все они были объединены в один df. Заголовки одинаковые или разные?

4. Различный df для каждой страны

5. С точки зрения подхода, я бы сказал, что для начала нужно выяснить, как поместить каждый набор в список, например list (Франция, csv, Германия, csv, …) и list (France_variables.csv, Germany_variables.csv, …). Затем я бы использовал цикл for или lapply () для их объединения, где все выходные данные были бы в виде списка

Ответ №1:

Вы можете использовать что-то вроде этого:

 library(tidyverse)
#Get Unique countries
country <- unique(gsub('\..*$|_.*', '', list.files(path = ".", pattern = "csv")))

#Loop
for (i in country) {
    dat <- list.files(path = ".", pattern = i) %>% map(read_csv) %>% reduce(rbind)
    assign( paste("df", i, sep = "_"), dat)
    rm(dat)
}
  

Это создаст фреймы данных, такие как df_France, df_Germany и т.д.

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

1. Спасибо, я попробую это

Ответ №2:

Поиграйте с grepl и посмотрите, сможете ли вы заставить это работать……

 # set the working directory (where files are saved)
setwd("C:/your_path_here/")

file_names = list.files(getwd())
file_names = file_names[grepl(".TXT",file_names)]

# print file_names vector
file_names

# see the data structure
str(file)

# run read.csv on all values of file_names
files = lapply(file_names, read.csv, header=F, stringsAsFactors = F)
files = do.call(rbind,files)

# run only on WY.TXT and NM.TXT
str(files)


# set column names
names(files) = c("col1", "col2", "col3", "col4", "col5")
str(files)


# finally...
write.table(files, "C:/your_path/mydata.txt", sep="t")
write.csv(files,"C:/your_path/mydata.csv")
  

http://www.rforexcelusers.com/combine-delimited-files-r/