【问题标题】:How to run a multi-step process in loop form in R如何在 R 中以循环形式运行多步骤过程
【发布时间】:2017-11-05 19:29:34
【问题描述】:

数据框:

mydata<-structure(list(ParkName = c("SEP", "CSSP", 
                    "SEP", "ONF", "SEP", 
                    "ONF", "SEP", 
                    "CSSP", "ONF", 
                    "SEP", "CSSP", 
                    "PPRSP", "PPRSP", 
                    "SEP", "ONF", 
                    "PPRSP", "ONF", 
                    "SEP", "SEP", 
                    "ONF"), 
       Year = c(2001, 2005, 1998,2011, 1991, 1991, 1991, 1991, 1991, 1992, 1992, 1992, 1992, 1992,
                                      1992, 1992, 1992, 1993, 1994, 1994), 
       LatinName = c("Mola mola", "Clarias batrachus", "Lithobates catesbeianus", "Rana catesbeiana", "Rana catesbeiana", 
                     "Rana yellowis", "Rana catesbeiana", "Solenopsis sp1","Rana catesbeiana", "Rana catesbeiana",
                     "Pratensis", "Rana catesbeiana",  "Rana catesbeiana", "sp2", "Orchidaceae",
                     "Rana catesbeiana","Formica", "Rana catesbeiana", "Rana catesbeiana", "sp2"), 
       NumTotal = c(1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 100, 2, 1, 2)), Names = c("ParkName", "Year", "LatinName", 
                                                                                                                  "NumTotal"),
  row.names = c(NA, -20L), class = c("tbl_df", "tbl",  "data.frame"))

该数据集代表多年以来不同公园中不同物种的丰富程度。请记住,这只是一个示例数据集,真实的数据集相当大。我基本上想要对这些数据做的是获取记录数据的每一年的物种 X 公园矩阵,然后使用“vegan”包计算每个公园每年的多样性指数。

在社区的一些帮助下,我设法创建了一个基于每年的数据框列表。然后我提取了数据框并将其转换为 Species X park 矩阵。然后,我设法获得了该特定年份每个公园的多样性值。以下是我使用的代码:

library(vegan)
dfList <- split(mydata, mydata$Year) #obtain dataframes for every year 
x<-data.frame(dfList[1]) #select dataframe from certain year
x2<-xtabs(x$X1991.NumTotal~x$X1991.ParkName+x$X1991.LatinName, 
data=x)#convert selected dataframe into species X site matrix
exp(diversity(x2, index = "shannon")) #extract diversity values

我将如何运行一个循环来基本上做我一年所做的事情,并一直做下去,并最终得到每个公园每年的多样性值列表?我在运行循环时遇到的问题是,这是一个非常不平衡的数据集,因此长度最终不会相互匹配。

【问题讨论】:

    标签: r loops lapply


    【解决方案1】:

    使用baseR

    do.call(rbind, by(mydata, mydata$Year, function(d){
      xt <- xtabs(NumTotal ~ ParkName + LatinName, data = d)
      data.frame(year = d$Year[1], park = dimnames(xt)[[1]], div = exp(diversity(xt)))}))
    
    #            year  park      div
    # 1991.CSSP  1991  CSSP 1.000000
    # 1991.ONF   1991   ONF 2.000000
    # 1991.SEP   1991   SEP 1.000000
    # 1992.CSSP  1992  CSSP 1.000000
    # 1992.ONF   1992   ONF 1.057118
    # 1992.PPRSP 1992 PPRSP 1.000000
    # 1992.SEP   1992   SEP 2.000000
    # 1993       1993   SEP 1.000000
    # 1994.ONF   1994   ONF 1.000000
    # 1994.SEP   1994   SEP 1.000000
    # 1998       1998   SEP 1.000000
    # 2001       2001   SEP 1.000000
    # 2005       2005  CSSP 1.000000
    # 2011       2011   ONF 1.000000
    

    使用data.table

    library(data.table)
    mydata[ , {xt <- xtabs(NumTotal ~ ParkName + LatinName, data = .SD)
      .(park =  dimnames(xt)[[1]], div = exp(diversity(xt)))}, by = Year]
    
    #     Year  park      div
    #  1: 2001   SEP 1.000000
    #  2: 2005  CSSP 1.000000
    #  3: 1998   SEP 1.000000
    #  4: 2011   ONF 1.000000
    #  5: 1991  CSSP 1.000000
    #  6: 1991   ONF 2.000000
    #  7: 1991   SEP 1.000000
    #  8: 1992  CSSP 1.000000
    #  9: 1992   ONF 1.057118
    # 10: 1992 PPRSP 1.000000
    # 11: 1992   SEP 2.000000
    # 12: 1993   SEP 1.000000
    # 13: 1994   ONF 1.000000
    # 14: 1994   SEP 1.000000
    

    请注意,by 保留组内的行顺序,以及组间的顺序。

    【讨论】:

    • 很抱歉回复得太晚了。是的,它确实。我最终使用了你的基本 R 编码谢谢
    【解决方案2】:

    一个简单的lapply 会做你想做的事。

    result <- lapply(dfList, function(x){
        x2 <- xtabs(NumTotal ~ ParkName + LatinName, data = x)
        exp(diversity(x2, index = "shannon")) #extract diversity values
    })
    result
    

    【讨论】:

    • @Rui_Barradas ,谢谢,我们有什么办法可以将“结果”中的所有这些列表合并到一个包含年份、公园名称和多样性指数的数据框中?
    • @LeoOhyamam 不,我不这么认为。如果您看到result 的元素,它们是具有不同长度的向量,其中一些被命名为向量,而另一些则不是。无法将其组合成数据框。
    • @Rui_Barradas,我试过这个:df &lt;- ldply(results, data.frame),并接近但未列出公园名称
    • @LeoOhyama...您可以在之前的accepted answer 中扩展by(tapply 的面向对象的包装器)并避免使用split 和lapply。
    • 至于这里的主要问题,请发布每个结果的输出结构。矩阵中的公园名称是行名还是列名?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    相关资源
    最近更新 更多