2

リストの各要素に関数を適用することについて質問があります。

これが私の問題です:

私は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変数ループについてはよく知りません。

私が探しているものを手に入れるために何を変更すべきかをループで変更するのを手伝ってもらえますか?

どうもありがとうございます!

4

1 に答える 1

5

lapply() を使用して、リストに関数を適用できます。

これはうまくいくはずです。ベクトルのリストを返します。

lapply(
  mylist,
  FUN = function(mydf)
    mydf[apply(
      region[, -3],
      1,
      FUN = function(x)
        which.min(apply(
          mydf[, -3],
          1,
          FUN = function(y)
            dist(rbind(x, y))
        ))
    ), 3]
)
于 2012-08-28T13:44:31.023 に答える