选择分组变量的子集

时间:2018-02-11 23:59:00

标签: r dplyr grouping subset

我使用的数据可以找到here(“sq.txt”文件)。

以下是数据摘要:

> summary(sq)
    behaviour           date         squirrel          time     
resting     :983   2017-06-28: 197   22995  : 127   09:30:00:  17  
travelling  :649   2017-06-26: 160   22758  : 116   08:00:00:  16  
feeding     :344   2017-06-30: 139   23080  : 108   16:25:00:  15  
OOS         :330   2017-07-18: 110   23089  : 100   08:11:00:  13  
vocalization:246   2017-06-27:  99   23079  :  97   08:31:00:  13  
social      : 53   2017-06-29:  96   22865  :  95   15:24:00:  13  
(Other)     : 67   (Other)   :1871   (Other):2029   (Other) :2585  

每个squirrel都有许多与不同行为相对应的观察结果(behaviour)。

例如,squirrel 22995被观察了127次。这127个观察对应于不同的behaviour类别:7 feeding,1 territorial,55 resting等。然后我需要划分每个behaviour的数量通过观察总数(即feeding = 7/127,territorial = 1/127,resting = 55/127等)来获得每个观察时间的比例{ {1}}。

我已使用behaviour包将squirrel的观察结果分组。

有没有办法,使用 dplyr为我计算一列的比例dplyr基于列的总观察结果behaviour其中值已分组?

1 个答案:

答案 0 :(得分:1)

这样的东西?

sq %>% 
  count(squirrel, behaviour) %>% 
  group_by(squirrel) %>% 
  mutate(p = n/sum(n)) %>% 
  # add this line to see result for squirrel 22995
  filter(squirrel == 22995)

# A tibble: 8 x 4
# Groups:   squirrel [1]
  squirrel behaviour         n       p
     <int> <chr>         <int>   <dbl>
1    22995 feeding           7 0.0551 
2    22995 nest_building     4 0.0315 
3    22995 OOS               9 0.0709 
4    22995 resting          55 0.433  
5    22995 social            6 0.0472 
6    22995 territorial       1 0.00787
7    22995 travelling       32 0.252  
8    22995 vocalization     13 0.102

修改 如果你想在没有观察到行为的松鼠中包含零计数,一种方法是使用tidyr::complete()。默认情况下会生成NA,您可能希望将其替换为零。

library(dplyr)
library(tidyr)
sq %>% 
  count(squirrel, behaviour) %>% 
  complete(squirrel, behaviour) %>% 
  group_by(squirrel) %>% 
  mutate(p = n/sum(n, na.rm = TRUE)) %>% 
  replace_na(list(n = 0, p = 0)) %>%
  filter(squirrel == 22995)

# A tibble: 11 x 4
# Groups:   squirrel [1]
   squirrel behaviour         n       p
      <int> <chr>         <dbl>   <dbl>
 1    22995 dead           0    0      
 2    22995 feeding        7.00 0.0551 
 3    22995 grooming       0    0      
 4    22995 nest_building  4.00 0.0315 
 5    22995 OOS            9.00 0.0709 
 6    22995 resting       55.0  0.433  
 7    22995 social         6.00 0.0472 
 8    22995 territorial    1.00 0.00787
 9    22995 travelling    32.0  0.252  
10    22995 vigilant       0    0      
11    22995 vocalization  13.0  0.102