【问题标题】:Working with data frames: collecting results into one data frame in R使用数据框:将结果收集到 R 中的一个数据框中
【发布时间】:2012-06-27 05:30:33
【问题描述】:

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

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

在每一帧中,都有一个组变量(例如,组)。我只为一个数据帧,即 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)

这给了我 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") 循环初始过程。

【问题讨论】:

  • 创建一个嵌套的数据框列表list(1994 = list(f = zpb1994f, m = zbp1994m, r = zpb1994r), 1995 = list(f = ...))等,然后使用reshape2id.var = names(zpb1994f)融合它
  • 我会在该列表对象上执行ls(pattern = "zbp"),然后执行ldply

标签: r for-loop plyr


【解决方案1】:

扩展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

【讨论】:

    【解决方案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}
            }
        }
    

    话虽如此,Roman Luštrik 的无环ldply 解决方案似乎更直接......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 2014-12-16
      • 1970-01-01
      相关资源
      最近更新 更多