2

在工作区中,我有 48 个数据框:

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

在每一帧中,都有一个组变量(例如,组)。我只计算一个数据帧的统计量(Moran's I),即 zbp1994f:

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 ..... ..... .. .....
......

我想知道如何在一年中(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}
        }
    }

话虽ldply如此,Roman Luštrik 的无环解决方案似乎更直接......

于 2012-06-27T07:11:22.173 回答