リストの各要素に関数を適用することについて質問があります。
これが私の問題です:
私はDFのリストを持っています(私はより大きなDFを日数で割った):
mydf <- data.frame(x=c(1:5), y=c(21:25),z=rnorm(1:5))
mylist <- rep(list(mydf),5)
names(mylist) <-c("2006-01-01","2006-01-02","2006-01-03","2006-01-04","2006-01-05")
この偽のデータが同一である場合は気にしないでください)、これは単なる例です。リストの各DFの列「z」と、いくつかの空間座標を表す他の2つの列「x」と「y」に結果が表示されます。
「x」と「y」のリストを含む別の独立したDFがあり、いくつかの特定の領域(10個の領域を想像してください)を表します。
region <- data.frame(x=c(1:10),y=c(21:30),region=c(1:10))
最終的な目的は、10の領域ごとに、リストの各DFの(座標による)最も近いポイントからの(私の結果の)値「z」を持つことです。つまり、1つの領域の場合:リストのDF1からの10個の結果 "z"、次にDF2からの10個の他の結果 "z"、...可能であれば、最終的なDFは次のようになります(構造の場合)。
final1 <- data.frame("2006-01-01"=rnorm(1:10),"2006-02-01"=rnorm(1:10),
"2006-03-01"=rnorm(1:10),"2006-04-01"=rnorm(1:10),"2006-05-01"=rnorm(1:10))
1日に1つの列(つまり、リストの1つのDF)と各行に1つの値(たとえば、2006-01-01の場合:最初の領域を持つ最も近いポイントからの値 "z")。
私はすでに最も近い値を探すための小さな関数を持っています:
min.dist <- function(p, coord){
which.min( colSums((t(coord) - p)^2) )
}
次に、必要なものを取得するためにループを作成しようとしていますが、リストに問題があります。ループに2つの変数を入れる必要がありますが、機能しません。
これは、リストのDFを1つだけ取得した場合にほぼ機能します。
for (j in 1:nrow(region)){
imin <- min.dist(c(region[j,1],region[j,2]),mylist[[1]][,1:2])
imin[j] <- min.dist(c(region[j,1],region[j,2]),mylist[[1]][,1:2])
final <- mylist[[1]][imin[j], "z"]
final[j] <- mylist[[1]][imin[j], "z"]
final <- as.data.frame(final)
}
しかし、リスト全体を選択すると(オブジェクト「final」内のリストのDFごとに1列の結果を表示するために)、エラーが発生します。
最初の問題は、「領域」の長さがリストの長さと異なることだと思います。2番目の問題は、リストの長さに2番目の変数を追加することです。私はループにあまり詳しくないので、2変数ループについてはよく知りません。
私が探しているものを手に入れるために何を変更すべきかをループで変更するのを手伝ってもらえますか?
どうもありがとうございます!