在for循环中使用paste 0和get/eval命名列表,parse

cwtwac6a  于 2023-05-26  发布在  其他
关注(0)|答案(2)|浏览(118)

直奔主题。as1_list
我尝试使用name()和paste()在列表中命名data.frames,但在分配它们时遇到了问题

num_fu = c('1','2','3','4','5','6','7','8','9')
as <- data.frame()

for (i in num_fu){
           assign(paste0("flnames", i), list.files(path = paste0("C:/Users/thepr/Documents/data/as", i), pattern = "\\.csv", full.names = TRUE))
           assign(paste0("as", i, "_list"), lapply(get(paste0("flnames", i)),
                                          function(x){base::as.data.frame(read.csv(x))}))
           
           nm <- gsub(".csv", "", basename(get(paste0("flnames", i)))) %>% str_sub(., 1,6)

nm返回
nm 1“as1_01”“as1_02”“as1_03”“as1_04”“as1_05”“as1_07”“as1_08”“as1_09”“as1_11”“as1_13”[11]“as1_14”“as1_15”“as1_99”

names(as1_list)返回

> names(as1_list)
NULL

我试着得到(paste 0...

names(get(paste0("as", i, "_list"))) <- nm

返回错误:名称错误(get(paste 0(“as”,i,“_list”))<- nm:赋值目标扩展为非语言对象
所以我试过了

names(eval(parse(text = paste0("as", i, "_list")))) <- nm

发生了这样的事名称错误(eval(parse(text = paste 0(“as”,i,“_list”)))<- nm:赋值目标扩展为非语言对象
我还尝试了使用上述两个代码的assign()函数。

assign(names(get(paste0("as", i, "_list"))), nm)

返回:assign(names(get(paste 0(“as”,i,“_list”))),nm)错误:第一个参数无效

assign(names(eval(parse(text = paste0("as", i, "_list")))), nm)

返回:assign(names(eval(parse(text = paste 0(“as”,i,“_list”)))),nm)错误:第一个参数无效
请帮帮我谢谢你。

piwo6bdm

piwo6bdm1#

我了解到在for循环中使用assign()通常是一个坏主意。
只要学会使用R的矢量化特性,让它闪闪发光!
例如,考虑将for循环的结果存储在单个列表中。您仍然可以稍后将列表内容转换为单个对象:Unlist a list of dataframes
我认为,你试图完成的是批量读取. csv文件并重命名它们。看看这里:How to import multiple .csv files at once?

g0czyy6m

g0czyy6m2#

正如您在评论中所指定的,下面将为您提供一个 Dataframe 列表,每个 Dataframe 都来自一个CSV文件(以“as”开头),并以文件名(不包括扩展名)命名:

data_dir <- 'C:/Users/thepr/Documents/data/'
file_names <- list.files(data_dir, pattern = 'as.*\\.csv')

list_of_dataframes <- 
  file_names |>
  Map(f = \(fn) read.csv(file.path(data_dir,fn))) |>
  setNames(nm = gsub('\\.csv', '', file_names))

注意使用Map来操作一个列表(在本例中是文件名的列表),并避免任何for循环(在R中通常是一个好主意)。

相关问题