如何重新格式化矩阵,以便我不会丢失R中的标题名称

时间:2016-12-07 17:18:02

标签: r matrix vegan

我有一张年份(1999:2014年)和次区域(1:4)的物种相对丰富度的表格。我正在使用FD包来使用函数dbFD(x,a)计算函数多样性,其中'x'是特征*种类矩阵,'a'是社区*物种丰度矩阵。

relativeabun是一张22260 obs的表格。 5个变量[,1] =年,[,2] =子区域[,3] = Species_CD [,4] =丰度[,5] =相对丰度

对于'a',我需要一个矩阵,其中我的56个社区的物种_CD为ncol = 371,我的56个社区为nrow = 56(每个子区域为每年一次,例如1999年1区,1999年2区等)

relativeabun <- read.csv("~/Dropbox/Thesis/Functional_Diversity/Results with four Subregions/relativeabun_year_sub.csv", header = TRUE) 

for (whatarea in 1:4){ #subregions upper, middle, lower, DT
  for (whatyear in 1999:2014){

thisdata1 = relativeabun[relativeabun$Year == whatyear,]
thisdata2 = thisdata1[thisdata1$Subregion == whatarea,]
thisdata3 = thisdata2$Relative.Abundance
relabun = t(thisdata3) #transpose data so 371 columns 

functionaldiversity <- dbFD(spectrait_matrix,relabun)
    }
}

我的'a'(relabun矩阵)是不正确的,因为它不包括物种名称......应该是一个371列的矩阵,其中每个物种的相对丰度在[ 1,]

我哪里错了?

1 个答案:

答案 0 :(得分:0)

你可以试试这个包&#34; reshape2&#34;。似乎有用的是

    library(reshape2)
    set.seed(123)
    relativeabun <- data.frame(year=rep(2010:2015,10), Subregion=rep(c("Asia", "Africa"), 30), Species_CD=rep(c("A", "B", "C", "D", "E")), Abundance=runif(60), RelAbundance=runif(60))

这会产生类似

的内容
    year Subregion Species_CD Abundance RelAbundance
    2010      Asia          A 0.2655087    0.9128759
    2011    Africa          B 0.3721239    0.2936034
    2012      Asia          C 0.5728534    0.4590657
    2013    Africa          D 0.9082078    0.3323947
    2014      Asia          E 0.2016819    0.6508705
    2015    Africa          A 0.8983897    0.2580168

接下来,您需要融化此数据框并将其与列中的物种一起投回

    tmp <- melt(relativeabun, id.vars=c("year", "Subregion", "Species_CD"), value.name="Value")
    relabun <- dcast(data=tmp, ...~Species_CD, fun.aggregate=sum, value.var="Value")
    relabun <- relabun[relabun$variable=="RelAbundance", -c(3)]

最后一行是摆脱丰度数据和融化变量。