Как выполнить полное внешнее объединение нескольких файлов CSV в один файл data.table в R? - PullRequest
1 голос
/ 08 апреля 2020

Я уже некоторое время использую python для работы с pandas фреймами данных. Я хочу переключить тот же код, который я использую, на R. Однако у меня нет особого опыта работы с R, и я не уверен, какие варианты у меня есть, чтобы сделать то же самое. У меня есть папка с множеством CSV-файлов, и у меня есть список имен файлов, которые я хотел бы перебрать и выполнить полное внешнее объединение файлов.

В pandas я бы запустил следующая команда,

import pandas as pd
filelist = pd.read_excel("/Users/XXX/Documents/test/data/list.xlsx") #contains a list of filenames in the File column around 8000 rows long

workingdf = pd.DataFrame() #create a blank data frame

for subdir in filelist.File:
    df = pd.read_csv(f"/Users/XXX/Documents/test/data/{subdir}",index_col=0) #open file 2 columns named DATE and VALUE
    df = df.rename(columns={"VALUE":subdir}) #rename the value column to the file name
    workingdf = pd.merge(workingdf,df,how='outer',left_index=True,right_index=True)

Последняя часть кода объединяет все кадры данных в словаре в один большой кадр данных, используя полное внешнее объединение.

Я хочу взять несколько CSV файлы, которые у меня есть в папке, переберите список имен файлов, создайте таблицы данных из файлов и добавьте их один за другим, чтобы создать одну большую таблицу данных в R.

Я пытаюсь переключиться на R, потому что у меня проблемы с памятью и эффективностью, и кто-то предложил мне попробовать.

Как я могу запустить тот же набор команд в R? У меня нет особого опыта в этом, но у меня пока есть следующий код.

library(openxlsx)
library(data.table)

filelist <- openxlsx::read.xlsx("/Users/XXX/Documents/test/data/list.xlsx")


for (row in filelist[1]){

}

Я знаю, что мне нужно использовать tempdf = read.csv(paste("/Users/XXX/Documents/test/data/",row,sep"")), чтобы создать путь к файлу и создать фрейм.

Функция переименования должна иметь вид names(tempdf)[2]<-row

Я также знаю, что должен использовать workingdf <- merge(workingdf,tempdf,by="DATE",all=TRUE)

Но я не знаю, с чего начать это потому, что я не могу создать пустой кадр данных, как в pandas, и просто начать объединять их. Есть предложения?

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Можно использовать функции R, такие как paste0() или sprintf(), чтобы создать полное имя файла пути для списка файлов, которые будут считаны в R. Вот пример, который загружает электронные таблицы для первых семи поколений покемонов, распаковывает файл и использует sprintf() для создания путей к каждому файлу.

download.file("https://raw.githubusercontent.com/lgreski/pokemonData/master/PokemonXLSX.zip",
               "PokemonXLSX.zip",
               method="curl",mode="wb")
unzip("PokemonXLSX.zip")
library(readxl)
# create a set of numbers to be used to generate file names
# that have leading zeros, e.g. gen01.xlsx, gen02.xlsx, etc. 
generationIds <- 1:7
spreadsheets <- lapply(generationIds,function(x) {
     # use generation number to create individual file name
     aFile <- sprintf("./PokemonData/gen%02i.xlsx",x)
     data <- read_excel(aFile)
     })

Чтобы объединить файлы с помощью переменной ID, можно использовать функцию Reduce(), как показано в другом ответе.

Следующий код иллюстрирует, как создаются имена файлов.

theFiles <- lapply(generationIds,function(x) {
        # use generation number to create individual file name
        aFile <- sprintf("./PokemonData/gen%02i.xlsx",x)
        message(paste("current file is: ",aFile))
        aFile
})
0 голосов
/ 08 апреля 2020

Пример полного внешнего объединения в списке csvs

library(data.table)
#get list of csv in current folder
l <- list.files(pattern="(.*).csv")

#use data.table::fread to read them and then merge with all=TRUE for full outer join
#Reduce is a recursive function takes prev output to be merged with next input
Reduce(function(x, y) merge(x, y, by="DATE", all=TRUE), lapply(l, fread))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...