R: Суммируйте каждый столбец по подгруппе - PullRequest
0 голосов
/ 01 октября 2018

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

Пример набора данных:

library(vegan)
data("dune")
data("dune.env")
dune$plot <- c(1:20); dune.env$plot <- c(1:20)
merge(dune, dune.env)

Таким образом, в настоящее время существует 20 участков с 30 наблюдаемыми видами и 5 соответствующими переменными среды.Я хотел бы получить сумму числа особей, наблюдаемых по видам, сгруппированных по «Управлению».Я пробовал что-то вроде этого:

library(tidyverse)
sums <- group_by(data, data$Management) %>% colSums(data[,(2:31)], na.rm = TRUE)

, но я всегда получаю сообщение об ошибке из-за неправильного затемнения.Я не уверен, как бы я решил свою проблему.В идеале результатом должен быть фрейм данных с 4 строками (по 1 для каждого типа управления), в котором суммированы все виды (столбцы 2:31).

Ответы [ 3 ]

0 голосов
/ 01 октября 2018

Ну, я делал нечто очень похожее несколько дней назад: Как получить богатство видов и изобилие для участков с несколькими образцами, используя dplyr

Чтобы изменить отличный ответ, заданный @акрун:

  df <- merge(dune, dune.env)
  library(dplyr)
  df2<- df %>% 
      group_by(Management) %>% 
      summarise_at(sum, .vars = vars(Achimill:Callcusp)) 
0 голосов
/ 01 октября 2018

rowsums делает то, что вам нужно:

dat <- merge(dune, dune.env)

> rowsum(dat[,2:31], dat$Management)
   Achimill Agrostol Airaprae Alopgeni Anthodor Bellpere Bromhord Chenalbu   ...
BF        7        0        0        2        4        5        8        0   ...    
HF        6        7        0        8        9        2        4        0   ...     
NM        2       13        5        0        8        2        0        0   ...     
SF        1       28        0       26        0        4        3        1   ...     
0 голосов
/ 01 октября 2018

использование data.table:

require(data.table)
a <- merge(dune, dune.env)
setDT(a)
a[, lapply(.SD, sum), by = Management, .SDcols = names(a)[2:31]]
...