2012-06-27 60 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