【问题标题】:R-Dplyr - Conditionally Count same column in dataframe (in summarize of group by)R-Dplyr - 有条件地计算数据框中的同一列(分组汇总)
【发布时间】:2020-07-06 01:40:07
【问题描述】:

我有一个由查询生成的数据框(将 sql 查询硬编码到 R 脚本中)。然后我分组并总结以获得每个工作人员的最小/最大/观察次数。我想做的是,对于每个工作人员,在 1.00 的 5% 以内(即 0.95

按如下方式创建模型:

library(dplyr)

Roll_Number <- c("1234567", "111111111", "222222222", "333333333", "444444444", "555555555", "666666666", "777777777")

Shift_Ratio <- c("1.05", "0.99", "1.45", "1.02", "0.97", "1.01", "0.97", "1.24")

Staff <- c("John", "John", "John", "Dave", "Dave", "Dave", "Dave", "Dave")

Shift_Data <- data.frame(Roll_Number, Shift_Ratio, Staff)


SummaryStats <- Shift_Data %>% group_by (`Staff`) %>%
 dplyr::summarize( 'Number of Accounts' = n(),
                   'Within 5%' = sum(`Shift_Ratio`[`Shift_Ratio` <= 1.05])

 )

我尝试过使用 n,尝试过滤/总结等,但还没有运气。我已经看到并完成了它在一个列上过滤并应用如下聚合函数的地方,只是不确定如何过滤条件的两边。使用 between(Shift Ratio, 0.95, 1.05) 的尝试无效。我已经避免在 summarise 调用之前进行过滤,尽管我想我可以将这个过程分成两个步骤并过滤总数,然后将该摘要左连接到一个主摘要中,该主摘要对没有过滤器的项目进行总计。只是希望我缺少一种更优雅的方法。任何建议表示赞赏。

'Exempt Value' = sum(as.numeric(as.character(`Current Year Value`)) [`Tax Status` == "Exempt"], na.rm=T)

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    Shift_Ratio 列属于“字符”类,因此无法对其进行数学运算。我们使用type.convertShift_Data 中的所有列转换为相关类,并计算每个Staff 从1 到5% 范围内的百分比。

    library(dplyr)
    
    Shift_Data %>% 
      type.convert(as.is = TRUE) %>%
      group_by(Staff) %>%
      summarise(Number_of_Accounts = n(),
                Within_5_perc = mean(between(Shift_Ratio, 0.95, 1.05)) * 100)
    
    # A tibble: 2 x 3
    #  Staff Number_of_Accounts Within_5_perc
    #  <chr>              <int>         <dbl>
    #1 Dave                   5          80  
    #2 John                   3          66.7
    

    【讨论】:

    • Type.convert(as.is) 太棒了!我的实际数据集中确实有一些空值,并且在命令之间出现大小错误。我可以使用 na.rm = T 吗?我在 mean() 函数中尝试过,但没有奏效。 between() 可以接受 na.rm 或类似的东西吗?在我看到的规范中看起来不像。很快将标记为答案,因为您公平地解决了发布的问题并帮助教了皈依者。谢谢!错误:位置 1 的尺寸 (1) 不正确,预期为:61
    • @SMS 你有NULLNAs 吗?您可以使用filter 删除它们或在mean 中添加na.rm = TRUE
    • 原来这是随后出现的问题,试图使用安排但有问题(可能与类型转换有关)。 5% 的代码在我的伪 re-prex 和更大的代码中都有效。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 2023-03-14
    • 2019-03-06
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多