在每个子集上设置列表并运行函数,并将结果放入数据框中

时间:2018-02-02 01:33:59

标签: r

我有一个像这样的数据框:

 df<- data.frame(plot=c(rep(133, 3), rep(134,4)), plant= c(1,1,2,3,3,4,4), 
 morpho= c("A", "B", "C", "D","E","B","C"), freq=c(2,1,2,1,3,1,3))

然后我使用以下内容以cast()可用的格式获取数据框:

library("reshape")
cast<- cast(df, plot+plant ~ morpho, 
               value ='freq',fun.aggregate=sum)

这使它成为7个元素的列表。

我现在想要在每个图中应用函数来计算每个图中植物之间的β多样性。我会使用这个函数:

library("vegetarian")
d(cast, lev="beta", q=1, boot=TRUE)

我尝试了以下但没有成功:

 lapply(cast, function(x){d(x,lev= "beta", q=1, boot=TRUE)})

此示例的输出为:

 output<- data.frame( plot=c(133, 134), D.Value= c(2,2 ), StdErr=c(0, 1.734224e-16)  )

1 个答案:

答案 0 :(得分:1)

我们可以通过

来做到这一点
library(dplyr)
library(purrr)
split(cast[-(1:2)], cast$plot) %>%
        map(d, lev = "beta", q = 1, boot = TRUE) %>%
        map(as_tibble) %>% 
        bind_rows(., .id = 'plot')

如果我们查看OP的代码,它会循环遍历每一列,其中d需要丰富的&#39; as(基于?d

  

社区数据作为矩阵,其中列是单独的物种和   行是站点。矩阵元素是丰富的数据

因此,我们通过“情节”split对数据集进行list。在数据子集上,即只有计数列的数据,应用&#39; d&#39;使用map在每个bind_rows元素上,然后使用while(true) for (uint g = 0; g < pictures.size(); g++){ glUseProgram(pictures[g]->ProgramId); pictures[g]->render(); }

绑定列表元素