我正在嘗試創建一個有效的代碼來打開包含串列的資料檔案,提取串列中的一個元素,將其存盤在資料框中,然后在打開下一個之前洗掉該物件。
我的想法是使用回圈來做到這一點。不幸的是,我在學習如何使用回圈來做到這一點方面還很陌生,并且不知道如何撰寫代碼。
我已設法使用以下代碼打開資料集:
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)
}
對于任何愚蠢的錯誤(或問題),我深表歉意,并非常感謝任何幫助。
uj5u.com熱心網友回復:
這是一個可能的解決方案,使用函式重命名您正在加載的物件。我loadRData從這里得到。該loadRData函式使這更容易接近,因為您可以使用不同的名稱加載物件。
為可重現的示例創建一些資料。
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 包于 2022-01-14 創建(v2.0.1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/412368.html
標籤:
