【发布时间】:2020-06-27 18:42:27
【问题描述】:
我正在编写一个通用过程,但我不明白如何处理未知对象的名称。在这种情况下,我将所有 *.Rda 文件加载到一个目录中并执行 rbind 以创建一个数据框。 Rda 文件的名称和数量可能会有所不同。我的问题是如何最好地处理这种情况?
library(data.table)
# Load all data frames in wd
my_files <- list.files(pattern='*.Rda',full.names = TRUE)
# Names of files without .Rda suffix
my_files_names <- gsub(".Rda$","",list.files(pattern='*.Rda'))
# load each data frame, creates objects with names in my_files_names
for(i in 1:length(my_files)){
load(my_files[i])
}
# make large data frame from all loaded data frames
combined_df <- rbindlist(my_files_names)
我收到了错误
Input is character but should be a plain list of items to be stacked
combined_df <- rbindlist(as.list(my_files_names)) 不起作用。
该示例使用rbind 将每个对象作为参数工作,但由于某种原因,字符向量不能用于引用运行时名称未知的对象。我错过了什么?
【问题讨论】:
-
您真的需要代码下游的对象名称吗?因为如果不是,你可以尝试使用类似的东西:
combined_df <- my_files %>% lapply(., load) %>% rbindlist()使用library(magrittr)用于%>%管道(我没有你的数据,所以我无法测试它)。请注意@A5C1D2H2I1M1N2O1R2T1 的评论,并确保您的对象仅包含一个 data.frame 以使这种解决方案能够正常工作 -
.Rda文件只包含一个数据框。谢谢@davidnortes 的建议。名字并不重要。你的建议给了我一个错误Error in rbindlist(.) : Item 1 of input is not a data.frame, data.table or list。我也尝试过combined_df <- bind_rows(lapply(my_files, load)),但这也不起作用。 -
如果你的 Rda 文件有一个 data.frame 为什么不使用 RDS 文件呢?
-
@jangorecki 是的,Rds 会更好。这些文件是由另一个用户创建的……我将测试这个问题是否与 Rda/Rds 有关。谢谢你的建议
-
创建
rds文件并使用它们有效。我认为问题来自rda格式,但我不确定。my_files <- list.files(pattern='*.rds',full.names = TRUE)然后combined_df <- bind_rows(lapply(my_files, readRDS))工作。
标签: r dataframe data.table