2012-06-27 45 views
2

在工作区中的一个数据帧,我有48个数据帧:与数据处理帧:收集结果存入中的R

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

在各帧中,有一组变量(比如说,基团)。我按组计算统计(莫兰的我)只是一个数据帧,即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”)。

+0

创建一个数据框'list(1994 = list(f = zpb1994f,m = zbp1994m,r = zpb1994r),1995 = list(f = ...))'等的嵌套列表,然后使用'reshape2'将其解开, 'id.var = names(zpb1994f)' – mnel

+2

我会做'ls(pattern =“zbp”)',然后在该列表对象上执行'ldply'。 –

回答

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

这就是说,罗曼Luštrik的无袖ldply解决方案似乎更直接...

+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)) 

使一些函数产生一个数据帧:由MNEL的建议

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