更改表格以用于图表

时间:2019-06-04 14:11:17

标签: r dataframe

我有一个数据框架,其中有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
...     

我确定有办法,总有办法,但是我找不到它:(

1 个答案:

答案 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)