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

时间:2018-11-07 14:18:26

标签: r dataframe subset bins

我有一个数据框架,其中包含鱼类种群抽样数据。我想创建一个垃圾箱,以计算每个物种在给定的长度组中有多少鱼。  以下代码完成了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()上使用它。这是我在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))

1 个答案:

答案 0 :(得分:0)

这符合您的期望吗?

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