【问题标题】:Looping over lists, extracting certain elements and delete the list?循环列表,提取某些元素并删除列表?
【发布时间】:2022-01-14 13:27:42
【问题描述】:

我正在尝试创建一个高效的代码来打开包含列表的数据文件,提取列表中的一个元素,将其存储在数据框中,然后在打开下一个之前删除该对象。

我的想法是使用循环来做到这一点。不幸的是,我在学习如何使用循环来做到这一点方面还很陌生,并且不知道如何编写代码。

我已设法使用以下代码打开数据集:

for(i in 1995:2015){
  objects = paste("C:/Users/...",i,"agg.rda", sep=" ")
  load(objects)
} 

问题是每个数据集都非常大,R 无法一次打开所有数据集。因此,我现在尝试在每个列表中提取一个名为:tab_<<i value >>_agg[["A"]](例如tab_1995_agg[["A"]])的元素,然后删除该对象并遍历每个 i(它们是不同的年份)。

我尝试过使用以下代码,但它不起作用

for(i in unique(1995:2015)){
  objects = paste("C:/Users/...",i,"agg.rda", sep=" ")
  load(objects)
  tmp = cat("tab",i,"_agg[[\"A\"]]" , sep = "")
  y <- rbind(y, tmp)
  rm(list=objects)
}

对于任何愚蠢的错误(或问题),我深表歉意,并非常感谢任何帮助。

【问题讨论】:

  • 使用file.remove(objects) 而不是rm(list = objects)
  • tmp = cat("tab",i,"_agg[[\"A\"]]" , sep = "")NULL 分配给对象tmp。实际上,cat 用于在控制台中输出对象。那是错字吗? t您想改用paste() 吗?如果你改变它会发生什么?
  • 您好!我使用 cat 是因为 paste 不允许在其中已经有引号的情况下粘贴字符串(据我所知,它不理解带引号的字符串)

标签: r loops


【解决方案1】:

这是一个可能的解决方案,使用函数重命名您正在加载的对象。我从here 得到loadRDataloadRData 函数使这更容易实现,因为您可以使用不同的名称加载对象。

为可重现的示例创建一些数据。

tab2000_agg <- 
  list(
    A = 1:5,
    b = 6:10
  )
tab2001_agg <- 
  list(
    A = 1:5,
    d = 6:10
  )

save(tab2000_agg, file = "2000_agg.rda")
save(tab2001_agg, file = "2001_agg.rda")
rm(tab2000_agg, tab2001_agg)

使用你的循环想法。

loadRData <- function(fileName){
    load(fileName)
    get(ls()[ls() != "fileName"])
}

y <- list()
for(i in 2000:2001){
  objects <- paste("", i, "_agg.rda", sep="")
  data_list <- loadRData(objects)
  tmp <- data_list[["A"]]
  y[[i]] <- tmp
  rm(data_list)
}
y <- do.call(rbind, y)

你也可以把它变成一个函数而不是使用循环。

getElement <- function(year){
  objects <- paste0("", year, "_agg.rda")
  data_list <- loadRData(objects)
  tmp <- data_list[["A"]]
  return(tmp)
}
y <- lapply(2000:2001, getElement)
y <- do.call(rbind, y)

reprex package (v2.0.1) 于 2022-01-14 创建

【讨论】:

    猜你喜欢
    • 2014-04-12
    • 2018-09-04
    • 2021-08-23
    • 2020-03-15
    • 2013-01-13
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多