首页 > 解决方案 > 在R中组合一堆数据文件

问题描述

样本

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。首先,这些文件包含我想要消除的随机 *。其次,我想在 R 中读取这两个文件并将它们保存为 fileABC 和 fileQWE。然后我想创建数据框 WANT,它将两个文件中的 var1 和两个文件中的 var2 结合起来,并根据它的来源创建等于 fileABC 或 fileQWE 的新变量“源”。我包括了我的尝试,但是您可以运行并看到它不起作用。

标签: rdatatabledplyr

解决方案


我们可以使用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))

推荐阅读