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 年間 (例では 2 年目) だけ元に戻したいと思います。

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[] にすることができます (それをデータベースに入れる方法がわからない)。変数 b と c を処理する他の R スクリプトがあります。複雑なのは、「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 1 年目と d <- 43 2 年目)。

更新 2: 説明が不十分で申し訳ありません。私はあなたの時間を無駄にしたくありません。最後にもう一度試してみましょう。

入力変数 a、b、c を処理する R スクリプトがあります。私の例ではこれらの変数は単純ですが、実際には sp::SpatialPolygonsDataFrame のようなより複雑なオブジェクトであるため、データフレームに配置することはできません。1 つの変数セットを処理する必要がある場合もあれば、別の変数セットを処理する必要がある場合もあります。これらの異なるセットをリストとしてリストとして保存するのが良いと考えたので、最初のセットで実行したい場合は、リストのリストの最初のリストを選択します:

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

2 年目を分析する必要がある場合は、「Year.I.need.to.analyze」を 2 に変更して、スクリプトを再度実行するだけです。ファイル名とディレクトリで「greping」と「paste():ing」を回避し、必要なファイルなどを追跡することを避けるために、各セットを個別の.Rdaファイルに保存しないことをお勧めします。

例が単純であることはわかっていますが、実際のスクリプトでは、年をまたいで、その間にプロットを作成してエクスポートする必要があります。そのすべてを堅牢な方法で自動化することを望んでいました。再び混乱して申し訳ありません。これを修正しようと何時間も試みた後、疲れすぎて質問を最善の方法で説明できないことに気付きました。

4

3 に答える 3

1

これを実現する方法は、R へのデータベース インターフェイスを使用することです。いくつかの選択肢があります。MySQL と SQLite の両方に、十分にテストされたインターフェースがあります。

R を使用したデータベースの推奨事項

RSQLite には、sqldf パッケージとうまく統合されているという利点があります。

于 2012-06-22T15:52:31.900 に答える
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')
于 2012-06-22T15:46:39.513 に答える
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)

/クリス

于 2012-06-24T22:15:48.490 に答える