У меня есть сгруппированный набор данных, содержащий данные, которые могут повторяться несколько раз в одной группе. Мне нужно подсчитать общее количество повторяющихся значений для каждого экземпляра, встречающегося в одной группе. Вот набор игрушек, который показывает мой пример:
structure(list(Group = c(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3,
3), ID = c("non repeating", "repeating", "repeating", "repeating",
"repeating", "non repeating", "repeating", "repeating", "non repeating",
"repeating", "repeating", "repeating", "non repeating")), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -13L))
Мой желаемый результат, потому что мне нужно отфильтровать их позже. будет следующее:
До сих пор я пробовал следующее:
ex <-
ex_data %>%
group_by(Group) %>%
mutate(
Value = case_when(
ID == lag(ID) ~
1,
TRUE ~ 0
)
) %>%
mutate(
Value = case_when(
ID == lead(ID) ~
1,
TRUE ~ Value
)
) %>%
group_by(ID, .add = T) %>%
mutate(count = sum(Value))
Это дает следующее, а не то, что я надеюсь получить, поскольку значения суммируются по каждой группе, а не по каждой группе и идентификатору.
Что я здесь делаю не так?
@Coy, он подсчитывает последовательные повторяющиеся значения внутри каждой группы.





library(dplyr)
df |>
mutate(Value = +((lead(ID) == ID | lag(ID) == ID) & ID == "repeating"),
Sum = consecutive_id(Value), .by = Group) |>
mutate(Sum = n(), .by = c(Group, Sum))
# # A tibble: 13 × 4
# Group ID Value Sum
# <dbl> <chr> <int> <int>
# 1 1 non repeating 0 1
# 2 1 repeating 1 2
# 3 1 repeating 1 2
# 4 2 repeating 1 2
# 5 2 repeating 1 2
# 6 2 non repeating 0 1
# 7 2 repeating 1 2
# 8 2 repeating 1 2
# 9 3 non repeating 0 1
# 10 3 repeating 1 3
# 11 3 repeating 1 3
# 12 3 repeating 1 3
# 13 3 non repeating 0 1
Проблема, с которой вы столкнулись, заключается в том, что вы группируете по Group и ID перед последним утверждением mutate(). Ваша группа Group == 2 и ID == "repeating" имеет размер 4, поэтому вы получаете это значение в своих выходных данных. Вам нужно что-то, чтобы сделать последовательные значения внутри Group отдельной группой.
Для этого я использовал consecutive_id(), который создает уникальный идентификатор для последовательных значений, и использовал его для группировки в финале mutate().
streak <- function(x) {
rls <- rle(x)
rep(rls$lengths, rls$lengths)
}
df |>
mutate(value = as.integer(ID == "repeating"), Sum = streak(value), .by = Group)
# Group ID value Sum
# <dbl> <chr> <int> <int>
# 1 1 non repeating 0 1
# 2 1 repeating 1 2
# 3 1 repeating 1 2
# 4 2 repeating 1 2
# 5 2 repeating 1 2
# 6 2 non repeating 0 1
# 7 2 repeating 1 2
# 8 2 repeating 1 2
# 9 3 non repeating 0 1
# 10 3 repeating 1 3
# 11 3 repeating 1 3
# 12 3 repeating 1 3
# 13 3 non repeating 0 1
просто используйте consecutive_id:
df %>%
group_by(Group, n = consecutive_id(ID))%>%
mutate(n = n())
# A tibble: 13 × 3
# Groups: Group, n [6]
Group ID n
<dbl> <chr> <int>
1 1 non repeating 1
2 1 repeating 2
3 1 repeating 2
4 2 repeating 2
5 2 repeating 2
6 2 non repeating 1
7 2 repeating 2
8 2 repeating 2
9 3 non repeating 1
10 3 repeating 3
11 3 repeating 3
12 3 repeating 3
13 3 non repeating 1
Верна ли желаемая выходная цифра? Я вижу четыре значения
repeatedво второй группе, но счетчик говорит, что их только два...