在Dplyr中按组计算行数:评估错误

时间:2017-10-28 08:44:27

标签: r dplyr

我正在尝试使用group_by后使用dplyr计算行数。我有以下数据:

scenario    pertubation    population    
   A            1             20
   B            1             30
   C            1             40
   D            1             50
   A            2             15
   B            2             25

我正在使用以下代码进行group_by和mutate:

test <- all_scenarios %>%
        group_by(scenario) %>%
        mutate(rank = dense_rank(desc(population)),
               exceedance_probability = rank / count(pertubation)) %>%
        select(scenario, pertubation, All.ages, rank, exceedance_probability) 

但是我一直在纠结这个错误信息,我不确定它的含义,或者为什么我一直这样做?

Error in mutate_impl(.data, dots) : 
Evaluation error: no applicable method for 'groups' applied to an object of class "c('integer', 'numeric')".

我希望我的输出数据看起来像这样:

scenario    pertubation    population  rank    exceedance_probability  
   A            1             20        12           0.06  
   B            1             30        7            0.035
   C            1             40        2            0.01 
   D            1             50        1            0.005
   A            2             15        34           0.17
   B            2             25        28           0.14

要计算超出概率,我只需要将等级除以观察数,但我发现在group_by语句之后很难在dplyr中执行此操作。我是否错误地订购了dplyr语句?

2 个答案:

答案 0 :(得分:1)

我们可以单独获取count并与原始数据集

连接
all_scenarios %>% 
      count(pertubation) %>% 
      left_join(all_scenarios, ., by = 'pertubation') %>%
      group_by(scenario) %>%
      mutate(rank = dense_rank(desc(population)),  exceedance_probability = rank /n) 

或者不是使用count,我们可以再做一次group_by并获取n()

all_scenarios %>%
   group_by(scenario) %>% 
   mutate(rank = dense_rank(desc(population))) %>% 
   group_by(pertubation) %>% 
   mutate( exceedance_probability = rank /n())

答案 1 :(得分:1)

您的问题来自

count(pertubation)

部分代码。您不能在group_by方案中使用count。我找不到一个很好的解释,但它不起作用。只需使用

n()
在代码中用

代替它。由于您按场景分组,并且每个场景插值在数据集中都是唯一的,因此通过计算每个场景中的行数,可以有效地计算每个场景的值或插值数量。