【问题标题】:Combine a bunch of data files in R在R中组合一堆数据文件
【发布时间】:2019-03-28 17:23:08
【问题描述】:

样本

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 的新变量“源”。我包括了我的尝试,但你可以运行并看到它不起作用。

【问题讨论】:

  • 试试library(dplyr); bind_rows(lst(fileABC, fileQWE), .id = 'source')
  • @akrun 其实很好,你知道怎么去掉“*”
  • 我发布了解决方案,请查看

标签: r datatable dplyr


【解决方案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))

【讨论】:

  • 只是好奇,但说我想从 .csv 文件中读取 fileABC 和 fileQWE 如何修改我尝试但无济于事的代码..@akrun
  • @bvowe .csv 的名称也是fileQWE.csv
猜你喜欢
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 2021-08-02
  • 2021-11-12
  • 2015-03-10
  • 1970-01-01
  • 2017-02-05
  • 2012-03-12
相关资源
最近更新 更多