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

时间:2012-06-27 05:30:34

标签: r for-loop plyr

在工作区中,我有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”)。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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解决方案似乎更直接......