使用数据帧:将结果收集到R中的一个数据帧中
在工作区中,我有48个数据帧:使用数据帧:将结果收集到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(
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}
}
}