Объедините кучу файлов данных в R - PullRequest
1 голос
/ 28 марта 2019

Пример

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

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

1 Ответ

1 голос
/ 28 марта 2019

Мы можем использовать 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...