如何使用dplyr计算第一次出现的值的重复次数

3
我有一个数据框,其中的分组情况基本上看起来像这样。
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解决方案的提示将不胜感激。
2个回答

2
您可以尝试以下方法:
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值的计数。 - HowardA
你正在调用 .$state,它只是一个向量,因此无法正确处理分组,只需使用 state 即可让 dplyr 发挥其魔力。 - moodymudskipper
好的,非常感谢!恐怕我不小心删除了你在这里提到的评论,但我猜我是在建议使用Df%>% group_by(ID)%>% summarize(r = rle(。$ state)$ lengths [1])进行操作。 - HowardA

1

这里不需要使用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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接