【问题标题】:Selecting subsets of a grouped variable选择分组变量的子集
【发布时间】:2018-02-11 23:58:59
【问题描述】:

我使用的数据可以在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)。

例如,squirrel22995 被观察了 127 次。这 127 个观察对应于不同的behaviour 类别:7 个feeding、1 个territorial、55 个resting 等。然后我需要将每个behaviour 的数量除以观察的总数(即@987654331 @ = 7/127、territorial = 1/127、resting = 55/127 等)来获得每个behaviour所花费的时间比例。

我已经使用dplyr 包将我的观察结果按squirrel 分组。

有没有一种方法,使用 dplyr我可以计算一列的比例 (behaviour) 基于总观察值列 (squirrel) 值在哪里分组?

【问题讨论】:

    标签: r dplyr grouping subset


    【解决方案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
    

    【讨论】:

    • 哇!是的。但是,有没有办法让观察为 0 的行为也显示在比例中?对我来说,0 也是有意义的。
    • 另外,愚蠢的后续问题:为什么所有其他列(datetime)之后都被删除了?
    • 回答第二个问题:自己运行count 看看会发生什么:) 基本上它与group_by 后跟summarise 相同。
    • 编辑回答第一个问题。
    • 谢谢!这正是我一直在努力做的。
    猜你喜欢
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    相关资源
    最近更新 更多