Применение бинов к группам фреймов данных без создания подмножеств фреймов данных - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть фрейм данных, содержащий данные выборки популяции рыб. Я хотел бы создать контейнеры для подсчета количества рыбы в данной группе длины для каждого вида. Приведенный ниже код выполняет эту задачу для 2 видов. Выполнение этого для всех видов в фрейме данных не кажется самым элегантным способом достижения этой цели.

Плюс я хотел бы применить этот код для других озер с различными видами. Было бы здорово найти «автоматизированный» способ применения этих бинов к каждой группе видов в фрейме данных.

Фрейм данных выглядит следующим образом:

Species TL   WT
BLG     75    6
BLG    118   27
LMB    200   98
LMB    315  369
RBS    112   23
RES    165   73
SPB    376  725
YEP    155   33


ss = read.csv("SS_West Point.csv" , na.strings="." , header=T)
blg = ss %>% subset(Species == "BLG")
lmb = ss %>% subset(Species == "LMB") 
blgn = blg %>% summarise(n = n())
lmbn = lmb %>% summarise(n = n())

###  20mm Length Groups - BLG  ###
blg20 = blg %>% group_by(gr=cut(TL , breaks = seq(0 , 1000 , by = 20))) %>% 
            summarise(n = n()) %>% mutate(freq = n , percent = ((n/blgn$n)*100) , 
                                   cumfreq = cumsum(freq) , cumpercent = cumsum(percent))
###  20mm Length Groups - BLG  ###
lmb20 = lmb %>% group_by(gr=cut(TL , breaks = seq(0 , 1000 , by = 20))) %>%
            summarise(n = n()) %>% mutate(freq = n , percent = ((n/lmbn$n)*100) , 
                            cumfreq = cumsum(freq) , cumpercent = cumsum(percent))

Я успешно использовал do () для запуска линейных моделей в этом фрейме данных, но не могу заставить его работать с cut (). Вот как я использовал do () для lm ():

ssl = ss %>% mutate(lTL = log10(TL) , lWT = log10(WT)) %>% group_by(Species)
m = ssl %>% do(lm(lWT~lTL , data =.)) %>% mutate(wp = 10^(.fitted))

1 Ответ

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

Делает ли это то, что вы ожидаете?

ss20 <- ss %>%
  add_count(Species) %>%
  rename(Species_count = n) %>%
  # I added Species_count to the grouping so it goes along for the ride in summarization
  group_by(Species, Species_count, gr=cut(TL , breaks = seq(0 , 1000 , by = 20))) %>%
  summarise(n = n()) %>%
  mutate(freq = n, percent = ((n/Species_count)*100), 
         cumfreq = cumsum(freq) , cumpercent = cumsum(percent)) %>%
  ungroup()


> ss20
# A tibble: 8 x 8
  Species Species_count gr            n  freq percent cumfreq cumpercent
  <chr>           <int> <fct>     <int> <int>   <dbl>   <int>      <dbl>
1 BLG                 2 (60,80]       1     1      50       1         50
2 BLG                 2 (100,120]     1     1      50       2        100
3 LMB                 2 (180,200]     1     1      50       1         50
4 LMB                 2 (300,320]     1     1      50       2        100
5 RBS                 1 (100,120]     1     1     100       1        100
6 RES                 1 (160,180]     1     1     100       1        100
7 SPB                 1 (360,380]     1     1     100       1        100
8 YEP                 1 (140,160]     1     1     100       1        100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...