2012-06-22 52 views
0

我每年都有一些變量,我想保存到磁盤以便稍後檢索。 例子:把變量放到列表中,然後讓它們回來

Yr.data <- list() 

#Year 1 
a <- "Year 1" 
b <- 72 
c <- matrix(1, nrow=2, ncol=2) 
Yr.data[[1]] <- list(a=a, b=b, c=c) 

#Year 2 
a <- "Year 2" 
b <- 99 
c <- matrix(3, nrow=2, ncol=2) 
Yr.data[[2]] <- list(a=a, b=b, c=c) 

save (Yr.data, file="Yr_data.Rda") 

rm(a,b,c,Yr.data) 

再後來我想這些變量回來,只是1年(第二年的示例中):

load("Yr_data.Rda") 
# Here I want to "unlist" Yr.data[[2]], so I get a, b, c as separate variables 
print(b) 
[1] 99 
c <- Yr.data[[2]]$C# I know this is a way to do it, but I want it automatically 

有一個聰明的辦法來做到這一點?既可以保存變量而不必寫a = a等等,也不用特別指定要變出的變量。我想每年保存的真實數據要複雜得多(空間對象,數據框等)。我認爲解決方案很簡單,但不知何故,我堅持找到它...

謝謝。

/克里斯

更新: 感謝努力幫助,我真的很感激。我意識到問題描述不夠清楚。 對於每一年(和測量點),例如變量b和c(但是每年和測量點具有不同的值)。我需要將這些值保存到磁盤供以後處理。 b例如可以是一個list()或者一個SpatialPolygonsDataFrame [](不知道如何把它放到數據庫中)。 我有其他R腳本來處理變量b和c。複雜性是我想在同一個文件中多次保存「b」。所以,我認爲這是聰明的把它放在一個列表:

Yr.data <- list() 
b <- 17 
Yr.data[[1]] <- list(b=b) 
b <- 42 
Yr.data[[2]] <- list(b=b) 

b <- Yr.data[[1]]$b # b becomes 17 
# Or this, in case I need to analyze the second year 
b <- Yr.data[[2]]$b # b becomes 42 

此代碼,但我希望能學到更強大的方式來做到這一點的情況下,我在以後添加更多的變量(例如d < - 第一年34和第二年的第< - 43)。

更新2:我很抱歉沒有足夠清楚地解釋。我不想浪費你的時間。讓我最後一次嘗試。

我有一個處理輸入變量a,b,c的R腳本。在我的示例中,這些變量很簡單,但實際上它們是更復雜的對象,如sp :: SpatialPolygonsDataFrame,所以我不能將它們放在數據框中。有時我需要處理一組變量,有時需要處理另一組變量。我認爲這很好的保存這些不同的集作爲列出一個清單,所以如果我想與第一組跑,我在名單列表中選擇第一個列表:

Year.I.need.to.analyze <- 1 
getAllVariablesInList(Yr.data[[Year.I.need.to.analyze ]]) # creates a, b, c 
result.I.want <- b * c 

當我需要分析第二年,我只需要將「Year.I.need.to.analyze」更改爲2並再次運行腳本。我寧願不將每個集合保存在單獨的.Rda文件中,以避免在文件名和目錄上「greping」和「paste():ing」,也避免跟蹤需要哪些文件等等。

我知道這個例子很簡單,但真正的腳本必須在幾年之間跳躍,在兩者之間創建和導出圖表等等。我希望能夠以一種穩健的方式自動化所有這些。 再次抱歉混淆。經過數小時的努力解決這個問題,我意識到我可能太累,不能以最好的方式解釋問題。

+0

'保存(A,B,C,文件= 「Yr1_data.Rda」)'等?我無法確切地告訴你在這裏之後。 – joran

+0

對不起,我應該提到強壯的代碼的原因,我想在一個文件中的所有年份。我需要多年保存數據。 – Chris

+0

我可能會使用一個環境而不是一個列表,但它不會有太大的不同。例如'e < - as.environment(Yr.data,recursive = FALSE); LS(E); E $℃; (e,b);得到(「c」,pos = e)' – GSee

回答

0

我終於設法做到了。也許應用函數會更好。再次感謝您的支持。

Yr.data.x <- Yr.data[[1]] # Select year to work with 

for (i in 1:length(Yr.data.x)) { 
    name.i <- names(Yr.data.x)[i] 
    value.i <- Yr.data.x[[i]] 
    assign(name.i, value.i) 
} 
rm(i, name.i, value.i, Yr.data.x) 

/克里斯

0

可能像

L3 <- LETTERS[1:3] 
(d <- data.frame(cbind(x=1, y=1:10), fac=sample(L3, 10, replace=TRUE))) 

## The same with automatic column names: 
y<-data.frame(cbind( 1, 1:10),  sample(L3, 10, replace=TRUE)) 

dput(y,file='test.data') 
rm(y) 
y<-dget(file='test.data') 

不知道我得到你所要求的。

,或者嘗試

dump(c("L3","y"),'test.data') 
1

達到這一目的的方法是使用一個數據庫接口R.有幾種選擇。 MySQL和SQLite的已經很好的測試接口:

Recommendations for database with R

RSQLite將有額外的好處在我心中,它是很好地與sqldf封裝內集成。

相關問題