Преобразование данных сообщества в широкоформатный для веганского пакета

Я пытаюсь проанализировать некоторые данные сообщества с помощью пакета vegan. У меня есть данные в неправильном формате, и я ищу способы изменить формат. У меня есть что-то вроде этого:

Habitat          Species        Abundance
1                  A                3
2                  B                2
3                  C                1
1                  D                5
2                  A                8
3                  F                4

И я думаю, что мне нужно:

Habitat      Species A       Species B       Species C    Species D    Species D
1                3               0              0              5          0
2                8               ...... etc
3                0

Или есть какой-нибудь другой формат, который может принимать vegan? Я пытаюсь вычислить сходство видового состава между местообитаниями.


person Karla Rivera Cáceres    schedule 05.06.2018    source источник
comment
Привет, Карла, и добро пожаловать в Stack Overflow! что ты уже испробовал?   -  person Max von Hippel    schedule 05.06.2018


Ответы (3)


Функция matrify() в пакете labdsv делает именно это для анализа сообщества.

Принимает data.frame в виде трех столбцов (sample.id, taxon, изобилие) и преобразует его в полную матричную форму, а затем экспортирует его как data.frame с соответствующими именами row.name и столбцов.

Другими словами, он преобразует ваши данные из длинного в широкий формат, так что каждый row представляет образец (в вашем случае «среда обитания»; иногда это будет «график»), каждый column представляет < em> разновидности, и каждый cell показывает численность данного вида клетки (column) в среде обитания данной клетки (row).

Пример:

dat <- data.frame(Habitat = c('Hab1','Hab1','Hab2','Hab2','Hab2','Hab3','Hab3'),
                  Species = c('Sp1','Sp2','Sp1','Sp3','Sp4','Sp2','Sp3'),
                  Abundance = c(1,2,1,3,2,2,1))

print(dat)

  Habitat Species Abundance
1    Hab1     Sp1         1
2    Hab1     Sp2         2
3    Hab2     Sp1         1
4    Hab2     Sp3         3
5    Hab2     Sp4         2
6    Hab3     Sp2         2
7    Hab3     Sp3         1

library(labdsv)
matrify(dat)

     Sp1 Sp2 Sp3 Sp4
Hab1   1   2   0   0
Hab2   1   0   3   2
Hab3   0   2   1   0

Бонус:

Я переписал matrify много лет назад, чтобы он мог обрабатывать продольный данные сообщества

  • В частности, моя функция matrify2() создает строки для каждой комбинации сюжет-год (т. Е. Переделанные строки для одного и того же участка) путем дублирования названий строк участка (или среды обитания) и добавления столбца Year.

Ниже приведен код:

#Create data.frame with PLOT, YEAR, and ABUNDANCE for each SPEC:

 #Creates function that can sort the data.frame output by:
   #Columns = individual SPECS, #Rows = plot by Year
   #Note: Code modified from matrify() function from labdsv package (v. 1.6-1)

 matrify2 <-  function(data) { 
   #Data must have columns: plot, SPEC, abundance measure,Year 
   if (ncol(data) != 4) 
       stop("data frame must have four column format")
   plt <- factor(data[, 1]) 
   spc <- factor(data[, 2])
   abu <- data[, 3]
   yrs <- factor(data[, 4])
   plt.codes <- sort(levels(factor(plt)))                                                     ##object with sorted plot numbers
   spc.codes <- levels(factor(spc))                                                           ##object with sorted SPEC names
   yrs.codes <- sort(levels(factor(yrs)))                                                     ##object with sorted sampling Years
   taxa <- matrix(0, nrow = length(plt.codes)*length(yrs.codes), ncol = length(spc.codes))    ##Create empty matrix with proper dimensions (unique(plotxYear) by # of SPEC)
   plt.list <- rep(plt.codes,length(yrs.codes))                                               ##Create a list of all the plot numbers (in order of input data) to add as an ID column at end of function
   yrs.list <- rep(yrs.codes,each=length(plt.codes))                                          ##Create a list of all the Year numbers (in order of input data) to add as an ID column at end of function
   col <- match(spc, spc.codes)                                                               ##object that determines the alphabetical order ranking of each SPEC in the spc.code list
   row.plt <- match(plt, plt.codes)                                                           ##object that determines the rank order ranking of each plot of the input data in the plt.code list
   row.yrs <- match(yrs,yrs.codes)                                                            ##object that determines the rank order ranking of each Year of the input data in the yrs.code list
   for (i in 1:length(abu)) {
       row <- (row.plt[i])+length(plt.codes)*(row.yrs[i]-1)                                   ##Determine row number by assuming each row represents a specific plot & year in an object of rep(plot,each=Year)
       if(!is.na(abu[i])) {                                                                   ##ONly use value if !is.na .. [ignore all is.NA values]
         taxa[row, col[i]] <- sum(taxa[row, col[i]], abu[i])                                  ##Add abundance measure of row i to the proper SPEC column and plot/Year row. Sum across all identical individuals.
       }
   }
   taxa <- data.frame(taxa)                                                                   ##Convert to data.frame for easier manipulation
   taxa <- cbind(plt.list,yrs.list,taxa)                                                      ##Add ID columns for plot and Year to each row already representing the abundance of Each SPEC of that given plot/Year.
   names(taxa) <- c('Plot','Year',spc.codes)
   taxa
 }

Пример:

dat.y <- data.frame(Habitat = c('Hab1','Hab1','Hab2','Hab2','Hab2','Hab3','Hab3','Hab1','Hab1','Hab2','Hab2','Hab2','Hab3','Hab3'),
                    Species = c('Sp1','Sp2','Sp1','Sp3','Sp4','Sp2','Sp3','Sp1','Sp2','Sp1','Sp3','Sp4','Sp2','Sp3'),
                    Abundance = c(1,2,1,3,2,2,1,1,2,1,3,2,2,1),
                    Year = c(1,1,1,1,1,1,1,2,2,2,2,2,2,2))
print(dat.y)

   Habitat Species Abundance Year
1     Hab1     Sp1         1    1
2     Hab1     Sp2         2    1
3     Hab2     Sp1         1    1
4     Hab2     Sp3         3    1
5     Hab2     Sp4         2    1
6     Hab3     Sp2         2    1
7     Hab3     Sp3         1    1
8     Hab1     Sp1         1    2
9     Hab1     Sp2         2    2
10    Hab2     Sp1         1    2
11    Hab2     Sp3         3    2
12    Hab2     Sp4         2    2
13    Hab3     Sp2         2    2
14    Hab3     Sp3         1    2

matrify2(dat.y)

  Plot Year Sp1 Sp2 Sp3 Sp4
1 Hab1    1   1   2   0   0
2 Hab2    1   1   0   3   2
3 Hab3    1   0   2   1   0
4 Hab1    2   1   2   0   0
5 Hab2    2   1   0   3   2
6 Hab3    2   0   2   1   0

Кроме того, к вашему сведению, вы должны узнать labdsv в соответствии с vegan документацией < / а>:

Вместе с пакетом labdsv пакет vegan предоставляет большинство стандартных инструментов описательного анализа сообщества.

person theforestecologist    schedule 05.06.2018
comment
Вероятно, вам также следует ознакомиться с менее известным ecodist, который предоставляет дополнительные преимущества, недоступные в vegan - person theforestecologist; 05.06.2018

Вы, вероятно, захотите spread свои данные. Например:

library(tidyr)
mydata %>% 
  spread(Species, Abundance)
person neilfws    schedule 05.06.2018

Вот что бы я сделал, используя dcast:

  • Создайте образец данных: cc=data.frame(habitat=c(1,2,3,1,2,3),species=c('a','e','a','e','g','a'), abundance=sample(1:10000,6)).

Вывод выглядит следующим образом (игнорируйте первый столбец, поскольку это автоматический индекс, созданный операцией вывода в R. Важны столбцы):

> cc  
>  habitat species abundance  
> 1       1       a      7814  
> 2       2       e      7801  
> 3       3       a      9510  
> 4       1       e      7443  
> 5       2       g      2160  
> 6       3       a      4026  
> 
  • Теперь растопите: m=melt(cc, id.vars=c("habitat","species")). Выход:
  habitat species  variable value
1       1       a abundance  7814
2       2       e abundance  7801
3       3       a abundance  9510
4       1       e abundance  7443
5       2       g abundance  2160
6       3       a abundance  4026
  • Теперь измените форму: dcast(m,habitat~species,fun.aggregate=mean), что дает:
  habitat    a    e    g
1       1 7814 7443  NaN
2       2  NaN 7801 2160
3       3 6768  NaN  NaN

Подробнее о reshape здесь.

Kf

person K F    schedule 05.06.2018