如何重新格式化我的矩阵,这样我就不会在 R 中丢失 header 名称
How do I reformat my matrix so that I do not lose the header name in R
我有一个 table 按年份 (1999:2014) 和分区域 (1:4) 划分的物种相对丰度。我正在使用 FD 包使用函数 dbFD(x,a)
计算功能多样性,其中 'x' 是性状 * 物种矩阵,'a' 是社区 * 物种丰度矩阵。
relativeabun
是一个 table,具有 22260 个 obs。 5 个变量 [1]=year, [2]=Subregion [3]=Species_CD [4]=Abundance [5] =Relative Abundance
对于 'a' 我需要一个矩阵,其中 Species_CD 的 ncol = 371 和我的 56 个社区的 nrow = 56(每年每个次区域,例如 1999subregion 1、1999subregion 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,]
中的 56 个社区
我哪里错了?
您可以尝试包 "reshape2"。似乎有效的是
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)]
最后一行去掉丰度数据和熔化变量。
我有一个 table 按年份 (1999:2014) 和分区域 (1:4) 划分的物种相对丰度。我正在使用 FD 包使用函数 dbFD(x,a)
计算功能多样性,其中 'x' 是性状 * 物种矩阵,'a' 是社区 * 物种丰度矩阵。
relativeabun
是一个 table,具有 22260 个 obs。 5 个变量 [1]=year, [2]=Subregion [3]=Species_CD [4]=Abundance [5] =Relative Abundance
对于 'a' 我需要一个矩阵,其中 Species_CD 的 ncol = 371 和我的 56 个社区的 nrow = 56(每年每个次区域,例如 1999subregion 1、1999subregion 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,]
我哪里错了?
您可以尝试包 "reshape2"。似乎有效的是
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)]
最后一行去掉丰度数据和熔化变量。