【问题标题】:R use a character vector holding names of data.frames for bind_rowsR 使用一个字符向量来保存 bind_rows 的 data.frames 的名称
【发布时间】:2021-05-11 18:29:10
【问题描述】:

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

我有一些从文件中导入的 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 &lt;- bind_rows(dataframes)

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

所以我尝试使用我认为可以完成这项工作的combinedData &lt;- 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]]
  }
}

所以从我读到的内容到现在,我必须对{{}}.data[[]] 做一些事情,但这个概念仍然没有通过我的突触。

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

非常感谢!

迈克尔

【问题讨论】:

  • bind_rows 不处理字符串,不知道为什么会这样。它只处理框架,所以......你需要给它框架。虽然使用assign 是不好的做法,但既然您已经这样做了,请尝试bind_rows(mget(dataframes))。但是,请阅读stackoverflow.com/a/24376207/3358227,您的batch.import 函数至少违反了几个“最佳实践”。
  • 非常感谢@r2evans!这有很大帮助!我应该补充一点,我是一个仍在努力学习这些概念的菜鸟。最后,我发现我完全走错了方向。

标签: r dataframe tidyverse


【解决方案1】:

您可以改用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

【讨论】:

  • 感谢您花费时间和精力。这个问题有点不同,我可以从最初帖子下面的建议中解决它。无论如何:非常感谢。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2015-09-16
  • 2021-12-27
  • 1970-01-01
  • 2016-09-09
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
相关资源
最近更新 更多