使用数据帧:将结果收集到R中的一个数据帧中

使用数据帧:将结果收集到R中的一个数据帧中,r,for-loop,plyr,R,For Loop,Plyr,在工作区中,我有48个数据帧: zbp1994f, zbp1994m, zbp1994r zbp1995f, zbp1995m, zbp1995r ...... zbp2009f, zbp2009m, zbp2009r 在每个帧中,都有一个组变量(例如,group)。我只为一个数据帧,即zbp1994f,按组计算一个统计量(Moran's I): library(ape) moranfn <- function(dta) { distinv <- -1/as.matrix(

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

zbp1994f, zbp1994m, zbp1994r
zbp1995f, zbp1995m, zbp1995r
......
zbp2009f, zbp2009m, zbp2009r
在每个帧中,都有一个组变量(例如,group)。我只为一个数据帧,即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)
我的目标是完成所有数据帧的工作,并创建一个面板数据集:

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

我想知道如何在这一年(1994:2009)和c(“f”、“m”、“r”)中循环初始过程。

扩展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))
set.seed(123)

Somelet我会在for循环中使用函数
get

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}
        }
    }
for(我在1994:2009){
(c中的j(“f”、“m”、“r”)){
临时结果}
else{rbind(result,temp_result)->result}
}
}

这就是说,Roman Luštrik的无环
ldply
解决方案似乎更简单…

创建一个嵌套的数据帧列表
list(1994=list(f=zpb1994f,m=zbp1994m,r=zpb1994r),1995=list(f=…)
等,然后使用
reforme2
,用
id.var=names(zpb1994f)将其熔化
我会对列表对象执行
ls(pattern=“zbp”)
然后执行
ldply
myfun <- function(.dat){
  med <- median(.dat$y)
  mean <- mean(.dat$z)
  result <- data.frame(stat1=med, stat2=mean)
}
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
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}
        }
    }