将 Bins 应用于数据框组而不创建子集数据框

Apply Bins to Data Frame Groups without making subset Data Frames

我有一个包含鱼类种群抽样数据的数据框。我想创建垃圾箱来计算每个物种的给定长度组中有多少条鱼。 下面的代码为 2 个物种完成了这个任务。对数据框中的所有物种执行此操作似乎并不是实现此目标的最优雅方式。

另外,我想将此代码应用于其他不同物种的湖泊。如果能找到一种 "automated" 方法将这些分箱应用于数据框中的每个物种组,那就太好了。

数据框如下所示:

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() 上工作。这是我在 lm():

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

这是否符合您的预期?

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