#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
и т.д.