R: Суммируйте каждый столбец, среднее значение покрытия и относительное среднее значение покрытия - PullRequest
1 голос
/ 29 января 2020

У меня есть кадр данных, который содержит данные о процентном покрытии многих видов растений на нескольких участках:

Пример

        sp1 sp2 sp3 sp4
PlotA   1   12  0   0
PlotB   0   3   5   0
PlotC   3   0   0   1
PlotD   0   6   0   0
PlotE   1   1   0   0

Я хотел бы рассчитать несколько вещей для каждого отдельного вида / столбца :

Сколько участков встречается у каждого вида? (напр. sp1 = 3, sp2 = 4, sp3 = 1)

Какой средний процент покров на вид на участок? (общее покрытие / общее количество участков, напр. sp1 = 1.0, sp2 = 4.4)

Какова относительная средняя. проц. покров на вид на участок? (ср. процент покрытия / сумма всех сроков покрытия)

Будет ли это легче сделать, сделав вид столбцами, а столбцы столбцами?

Ответы [ 2 ]

1 голос
/ 29 января 2020

Мы можем использовать пакеты dplyr и tidyr для обобщения и изменения данных. Смотрите ниже;

library(dplyr)
library(tidyr) # version 1.0.0

df1 %>% 
  summarise_all(list(count = ~sum(`>`(.,0)), 
                     avg.cover=~mean(.))) %>% 
  gather() %>% 
  separate("key", into = c("SP", "var"), sep = "_") %>% 
  pivot_wider(names_from = "var", values_from = "value") %>% 
  mutate(rel.avg.cover = avg.cover/sum(avg.cover))
#> # A tibble: 4 x 4
#>   SP    count avg.cover rel.avg.cover
#>   <chr> <dbl>     <dbl>         <dbl>
#> 1 sp1       3       1          0.152 
#> 2 sp2       4       4.4        0.667 
#> 3 sp3       1       1          0.152 
#> 4 sp4       1       0.2        0.0303

Данные:

read.table(text = "row  sp1 sp2 sp3 sp4
PlotA   1   12  0   0
PlotB   0   3   5   0
PlotC   3   0   0   1
PlotD   0   6   0   0
PlotE   1   1   0   0", header=T, row.names=1) -> df1
0 голосов
/ 29 января 2020

Решение без пакетов, используя colSums и colMeans

Данные:

df = data.frame(sp1 = c(1,0,3,0,1),
                sp2 = c(12,3,0,6,1),
                sp3 = c(0,5,0,0,0),
                sp4 = c(0,0,1,0,0),
                row.names = paste("Plot",c("A","B","C","D","E"),sep=""))

Вопросы:

# question 1
pres = colSums(apply(df,2,function(x) x>0))
# question 2
pct = colMeans(df)
# question 3
rlt = pct/sum(pct)*100

df2 = data.frame(pres,pct,rlt)
df2
#     pres pct       rlt
# sp1    3 1.0 15.151515
# sp2    4 4.4 66.666667
# sp3    1 1.0 15.151515
# sp4    1 0.2  3.030303

Обычно в Экологии мы ставим отдельных в ряд, но это преобразование легко достижимо функцией t(), если вам это нужно.

...