【发布时间】: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 <- 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]]
}
}
所以从我读到的内容到现在,我必须对{{}} 或.data[[]] 做一些事情,但这个概念仍然没有通过我的突触。
有什么建议可以使用我的 chr-vector 的 data.frame 名称来组合相应的 data.frames?
非常感谢!
迈克尔
【问题讨论】:
-
bind_rows不处理字符串,不知道为什么会这样。它只处理框架,所以......你需要给它框架。虽然使用assign是不好的做法,但既然您已经这样做了,请尝试bind_rows(mget(dataframes))。但是,请阅读stackoverflow.com/a/24376207/3358227,您的batch.import函数至少违反了几个“最佳实践”。 -
非常感谢@r2evans!这有很大帮助!我应该补充一点,我是一个仍在努力学习这些概念的菜鸟。最后,我发现我完全走错了方向。