R - подсчет для нескольких факторов в столбце - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть пример data.frame, «события», в котором есть несколько захватов добычи, происходящих в одном погружении.Основываясь на столбце «Захват», я использовал слово «обработка», чтобы подсчитать количество уловов за погружение.

Однако в некоторых случаях у меня есть несколько типов добычи в одном погружении.Как определить количество уловов добычи в зависимости от вида (то есть, сколько fish.a и сколько fish.b выловлено за одно погружение)?

Буду признателен за любой совет.

events <- data.frame(Prey_present =c("fish.a", "fish.a","", "fish.b", 
"fish.b","fish.b"),
Capture = c("","","handling", "", "", "handling") ,
Dive_id =c("dive.1", "dive.1","dive.1", "dive.1","dive.1", "dive.1"))

temp<- tapply(events$Capture, events$Dive_id, function(x) rle(x == 
"handling"))
ncaptures<- data.frame(id = names(temp), 
tally = unlist(lapply(temp, function(x) sum(x$values))))
final<-ncaptures[order(ncaptures$id),] 

Мой конечный результат (который я свяжу с моим большим data.frame) должен выглядеть примерно так:

final <- data.frame(fish.a =c(1),
fish.b = c(1),
Dive_id =c("dive.1"))                    

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Избавьтесь от столбца Capture и используйте библиотеку dplyr для агрегирования

library(dplyr)

capture_tally <- events %>% group_by(Dive_id, Prey_present) %>% 
    summarise(Count_of_Captures = n())

. Она будет группироваться по Dive_id и Prey_Present.затем используйте функцию summarise, чтобы выполнить подсчет для каждого конкретного погружения и захваченного типа добычи.

Вы можете назвать столбец Count_of_Captures как хотите.

РЕДАКТИРОВАТЬ: Вот вывод приведенного выше кода.

 Dive_id        Prey_present         Count_of_Captures
  <fctr>       <fctr>               <int>
1  dive.1                              1
2  dive.1       fish.a                 2
3  dive.1       fish.b                 3

РЕДАКТИРОВАТЬ: хорошо, попробуйте это.

library(tidyr); 

events %>% group_by(Dive_id, Prey_present) %>% 
   filter(Capture != "") %>%  # filter out captured ones (handling)
   summarise(Count = n()) %>%  #get the count for each fish type (long format)
   spread(Prey_present, Count) # Use the spread() function from tidyr package to convert the data from long to wide format

Полагаю, вы в любое время, когда колонка захвата пуста, рыба не была поймана.и что вы учитываете только те случаи, когда написано handling.Возможно, я снова неправильно вас понял, поэтому прошу прощения.

0 голосов
/ 19 ноября 2018
library(dplyr)               
new1<- events %>% group_by(Dive_id,Prey_present) %>% summarise(Capture = NROW(Capture))

это даст вам необходимый вывод

...