Объединить кучу файлов данных в R

#r #datatable #dplyr

#r #datatable #dplyr

Вопрос:

Пример

 fileABC=data.frame("id" = c(1:10),
                   "var1" = c("5*",8,1,4,"3*",5,6,7,"7*",1),
                   "var2" = c(7,4,6,"1*","8*",2,0,7,"0*",1))
fileQWE=data.frame("id" = c(1:10),
                   "var1" = c(7,"5*",8,1,4,"3*",5,"7*",6,2),
                   "var2" = c("8*",2,0,7,7,4,6,"1*","0*",1))
var1=c(fileABC$var1,fileQWE$var1)
var2=c(fileABC$var2,fileQWE$var2)
WANT = data.frame("id"=c(1:10,1:10)
                  "var1"=var1,
                  "var2"=var2,
                  "source"=c(rep("fileABC",10), rep("fileQWE",10)))
  

У меня есть fileABC и fileQWE. Во-первых, эти файлы содержат random *, которые я хочу исключить. Во-вторых, я хочу прочитать в R оба файла и сохранить их как fileABC и fileQWE. Затем я хочу создать фрейм данных WANT, который объединяет var1 из обоих файлов и var2 из обоих файлов и создает новую переменную «source», которая равна fileABC или fileQWE в зависимости от того, откуда она берется. Я включил свою попытку, но, как вы можете запустить и увидеть, она не работает.

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

1. Попробуйте library(dplyr); bind_rows(lst(fileABC, fileQWE), .id = 'source')

2. @akrun на самом деле это здорово, ты знаешь, как удалить «*»

3. Я опубликовал решение, пожалуйста, проверьте

Ответ №1:

Мы можем использовать bind_rows и получать числовые элементы, извлеченные с помощью parse_number

 library(tidyverse)
bind_rows(lst(fileABC, fileQWE), .id = 'source') %>% 
       mutate_at(vars(starts_with("var")), 
            list(~ readr::parse_number(as.character(.))))
  

Или с помощью base R

 lst1 <- mget(ls(pattern = "^file"))
out <- do.call(rbind, Map(cbind, lst1, source = names(lst1)))
row.names(out) <- NULL
out[2:3] <- lapply(out[2:3], function(x) as.numeric(sub("*", "", x, fixed = TRUE)))
  

Если мы хотим читать непосредственно из .csv файла (при условии, что файлы находятся в рабочем каталоге)

 files <- list.files(pattern = ".csv")
names(files) <- str_remove(files, "\.csv")
library(readr)
imap_dfr(files, ~ read.csv(.x) %>%
                 mutate_at(vars(starts_with("var")), 
                    list(~ readr::parse_number(.))) %>%
                 mutate(source = .y))
  

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

1. просто из любопытства, но скажем, я хотел прочитать в fileABC и fileQWE из файлов .csv, как я мог бы изменить этот код, который я пытался, но безрезультатно..@ akrun

2. @bvowe Также являются именами .csv fileQWE.csv и т.д.