首页 > 解决方案 > R 使用一个字符向量来保存 bind_rows 的 data.frames 的名称

问题描述

我正面临一个我认为很容易解决的问题,但结果却远远超出了我的视野。我想我脑子里有一个误解。

我有一些从文件中导入的 data.frames。所有这些都具有相同名称的完全相同的列。由于它们很多,我想使用 bind_rows 将它们组合成一个 data.frame 的过程自动化。

files <- list.files(path = "/home/username/Documents/", pattern = ".txt")

batch.import <- function(filename) {
  name <- unlist(strsplit(filename,"\\."))[1] # get rid of .txt
  df <- read_tsv(filename)
  colnames(df) <- c("name1", "name2", "name3", "name4")
  assign(name, df, envir = .GlobalEnv)
}

map(files,batch.import)

dataframes <- unlist(strsplit(files,"\\."))[seq(1,length(unlist(strsplit(files,"\\."))),2)]  # This produces a chr vector with all the data.frames I want to merge

我显然尝试的第一件事是:

combinedData <- bind_rows(dataframes)

本来太容易了……我同意。因为它是我真正理解的 chr 向量,所以这并不是指 data.frames,而只是试图对文本做一些事情。

所以我尝试使用combinedData <- bind_rows(paste(dataframes))我认为可以完成这项工作的。但它也不会合并 data.frames 。

所以我尝试了一些更复杂的东西,比如 for 循环(我也尝试在map()这里使用用法,不幸的是我不记得了):

for (df in dataframes) {
  if (exists("combinedData") {
    combinedData <- bind_rows(combinedData, .data[[df]]) # Here I think is the error (if not already before) I also tried {{}}
  } else {
    cobinedData <- .data[[df]]
  }
}

{{}}所以从我读到的东西到现在,我必须对or做点什么,.data[[]]但这个概念仍然没有渗透到我的突触中。

有什么建议可以使用我的 chr-vector 的 data.frame 名称来组合相应的 data.frames?

非常感谢!

迈克尔

标签: rdataframetidyverse

解决方案


你可以使用的是foreach。这是伪代码

library(foreach)
library(dplyr)

files <- list.files(path = "/home/username/Documents/", pattern = ".txt", full.name = TRUE)

# foreach will return a list of df which you can combine later using bind_rows
list_df <- foreach(i_file = files) %do% {
  df <- read_tsv(filename)
  colnames(df) <- c("name1", "name2", "name3", "name4")
  df
}

combine_df <- bind_rows(list_df)

如果要创建数据导入的命名列表

files_name_no_ext <- gsub(pattern = "\\.txt", replacement = "", files)
names(list_df) <- files_name_no_ext

推荐阅读