【问题标题】:how to count repetitions of first occuring value with dplyr如何使用 dplyr 计算第一个出现值的重复次数
【发布时间】:2018-04-15 13:36:48
【问题描述】:

我有一个数据框,其中的组基本上看起来像这样

DF <- data.frame(state = c(rep("A", 3), rep("B",2), rep("A",2)))

DF
  state
1     A
2     A
3     A
4     B
5     B
6     A
7     A

我的问题是如何计算第一个值在其第一个“块”中重复的 连续 行数。所以对于上面的DF,结果应该是3。第一个值可以出现任意次数,中间有其他值,或者它可能是唯一出现的值。 以下天真的尝试通常会失败,因为它会计算第一个值的所有次出现。

DF %>% mutate(is_first = as.integer(state == first(state))) %>% 
summarize(count = sum(is_first))

在这种情况下,结果是 5。因此,我们将不胜感激(最好是)dplyr 解决方案的提示。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    你可以试试:

    rle(as.character(DF$state))$lengths[1]
    [1] 3
    

    在您的 dplyr 链中,这将是:

    DF %>% summarize(count_first = rle(as.character(state))$lengths[1])
    
    #   count_first
    # 1           3
    

    或者过分热衷于管道,使用dplyrmagrittr

    library(dplyr)
    library(magrittr)
    DF %>% summarize(count_first = state %>%
                       as.character %>%
                       rle %$%
                       lengths %>%
                       first)
    
    #   count_first
    # 1           3
    

    也适用于分组数据:

    DF <- data.frame(group = c(rep(1,4),rep(2,3)),state = c(rep("A", 3), rep("B",2), rep("A",2)))
    
    #   group state
    # 1     1     A
    # 2     1     A
    # 3     1     A
    # 4     1     B
    # 5     2     B
    # 6     2     A
    # 7     2     A
    
    DF %>% group_by(group) %>% summarize(count_first = rle(as.character(state))$lengths[1])
    
    # # A tibble: 2 x 2
    #    group count_first
    #    <dbl>       <int>
    #  1     1           3
    #  2     2           1
    

    【讨论】:

    • 好的,谢谢,这似乎有效。我现在需要弄清楚如何将其应用于子组。假设我有一个分组变量 ID 并希望每个 ID 值都有这个计数。
    • 你打电话给.$state,这只是一个向量,所以不能正确处理组,只需使用state,这样dplyr就可以发挥它的魔力
    • 好的,非常感谢!恐怕我不小心删除了您在这里引用的评论,但我想我是在建议 Df %>% group_by(ID) %>% summarise(r = rle(.$state)$lengths[1]),
    【解决方案2】:

    此处不需要dplyr,但您可以修改此示例以将其与dplyr 一起使用。关键是函数rle

    state = c(rep("A", 3), rep("B",2), rep("A",2))
    
    x = rle(state)
    DF = data.frame(len = x$lengths, state = x$values)
    DF
    
    # get the longest run of consecutive "A"
    max(DF[DF$state == "A",]$len)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-25
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多