2

ワークスペースには、48個のデータフレームがあります。

zbp1994f, zbp1994m, zbp1994r
zbp1995f, zbp1995m, zbp1995r
......
zbp2009f, zbp2009m, zbp2009r

各フレームには、グループ変数(たとえば、グループ)があります。1つのデータフレーム、つまりzbp1994fについて、グループごとに統計(Moran's I)を計算します。

library(ape)
moranfn <- function(dta) {
    distinv <- -1/as.matrix(dist(cbind(dta$longi, dta$lati)))
    diag(distinv) <- 0
    Moran_result <- data.frame(Moran.I(dta$myvariable, distinv))
}

library(plyr)
Moran_result_1994f <- ddply(zbp1994f,"group",moranfn)

これにより、グループごとの統計を含むMoran_result_1994fデータフレームが得られます。

group stat1 stat2 sd     p-value
g1    0.049 -0.01 0.012  2.55e-06
g2    0.122 -0.05 0.041  2.45e-08
......

私の目標は、すべてのデータフレームに対して作業を行い、パネルデータセットを作成することです。

group year stat1 stat2 sd p-value
g1    1994 ..... ..... .. .....
g1    1995 ..... ..... .. .....
g1    1996 ..... ..... .. .....
......
g1    2009 ..... ..... .. .....
g2    1994 ..... ..... .. .....
......

最初の手順を1年(1994:2009)とc( "f"、 "m"、 "r")でループする方法を知りたいです。

4

2 に答える 2

4

mnelのソリューションの拡張:

いくつかのデータを作成します。

set.seed(123)

somelets <- letters[rep(1:5, 2)]

zbp1990f <- data.frame(x=somelets, y=rnorm(10), z=rnorm(10))
zbp1990m <- data.frame(x=somelets, y=rnorm(10), z=rnorm(10))
zbp1991f <- data.frame(x=somelets, y=rnorm(10), z=rnorm(10))
zbp1991m <- data.frame(x=somelets, y=rnorm(10), z=rnorm(10))

データフレームを生成する関数を作成します。

myfun <- function(.dat){
  med <- median(.dat$y)
  mean <- mean(.dat$z)
  result <- data.frame(stat1=med, stat2=mean)
}

mnelが提案するように、リストに結合します。

zbp.list <- list(`1990`=list(f=zbp1990f, m=zbp1990m), `1991`=list(f=zbp1991f, m=zbp1991m))

データフレームに溶け込む:

library(reshape2)

zbp.df <- melt(zbp.list, id.var=names(zbp1990f))

names(zbp.df) <- c("x", "y", "z", "group", "year")

データフレームの各要素に関数を適用します。

library(plyr)

results <- ddply(zbp.df, .(x, group, year), myfun)

head(results)

   x group year  stat1    stat2
 1 a     f 1990  0.5772947  1.5054975
 2 a     f 1991 -0.9089078  0.8848946
 3 a     m 1990 -1.3772585  0.5575522
 4 a     m 1991  0.3415841  0.2672701
 5 b     f 1990  0.1153694  0.4288322
 6 b     f 1991 -0.3054011 -0.7886498
于 2012-06-27T06:53:40.757 に答える
2

関数getを使用して、forループでそれを実行します。

for(i in 1994:2009){
    for(j in c("f","m","r")){
        temp <- get(paste("zbp",i,j,sep=""))
        temp_result <- ddply(temp,"group",moranfn)
        cbind(year=rep(i,nrow(temp_result)),fmr=rep(j,nrow(temp_result)),temp_result) -> temp_result
        if(i==1994 & j=="f"){temp_result -> result}
        else{rbind(result,temp_result) -> result}
        }
    }

そうは言っても、RomanLuštrikのループレスldplyソリューションはもっと簡単に思えます...

于 2012-06-27T07:11:22.173 に答える