我有一个数据框架,其中有66个物种具有3年的相对丰度。我想用ggplot2在R中绘制一个图表,以显示每种物种每年的丰度。问题是要做一个像这样的图,我需要数据框的形状不同,而我找不到更改它的代码。
所以,我的数据框是:
Species 2016 2017 2018
Sp1 4 8 3
Sp2 0 0 1
Sp3 6 4 8
Sp4 7 5 5
...
图形所需的数据框应具有以下形状:
Year Abundance
Sp1 2016 4
Sp1 2017 8
Sp1 2018 3
Sp2 2016 0
Sp2 2017 0
Sp2 2018 1
Sp3 2016 6
...
我确定有办法,总有办法,但是我找不到它:(
答案 0 :(得分:3)
使用tidyr
+ dplyr
。
library(tidyr)
library(dplyr)
df <- df %>%
tidyr::gather(key = "Year", value = "Abudance", -Species)
df
> df
Species Year Abudance
1 sp1 2016 4
2 sp2 2016 0
3 sp3 2016 6
4 sp4 2016 7
5 sp1 2017 8
6 sp2 2017 0
7 sp3 2017 4
8 sp4 2017 5
9 sp1 2018 3
10 sp2 2018 1
11 sp3 2018 8
12 sp4 2018 5
如@gersht所述,此答案并非绝对必要使用dplyr
软件包,我通常使用dplyr
以使阅读代码更流畅。
library(tidyr)
df <- tidyr::gather(df, key = "Year", value = "Abudance", -Species)
堆叠信息的另一种可能性是使用melt
包的函数reshape2
。我通知您该软件包已退役,但是有时我仍然使用它。
library(dplyr)
library(reshape2)
df <- df %>%
reshape2::melt(id.vars = "Species", value.name = "Abundance", variable.name = "Year")
##
## Or only reshape2
df3 <- reshape2::melt(df, id.vars = "Species", value.name = "Abundance", variable.name = "Year")
或者通过使用R中驻留的命令,而无需使用数据包。
# Columns to be maintained
column <- c("Species")
dfx <- utils::stack(df, select = -Species)
dfx[, column] <- rep(df$Species, (ncol(df) - length(column)))
colnames(dfx) <- c("Abundance", "Year", column)
dfx <- dfx[, c(3,2,1)]
df <- data.frame(Species = c("sp1", "sp2", "sp3", "sp4"),
"2016" = c(4,0,6,7),
"2017" = c(8,0,4,5),
"2018" = c(3,1,8,5), check.names = F)