Мне нужно объединить строки по группам в dplyr, но результирующий столбец должен учитывать только предыдущие столбцы, а не ведущие.
Я хочу, чтобы мои данные выглядели так:
| Я БЫ | сообщение | messages_used |
|---|---|---|
| 1 | 53 | 53 |
| 1 | 54 | 53,54 |
| 1 | 55 | 53,54,55 |
| 2 | 53 | 53 |
| 2 | 58 | 53,58 |
Это достижимо, используя только dplyr?
@DarrenTsai Он должен содержать все предыдущие значения, то есть 53,54,55.





Мы можем использовать dplyr::group_by() и purrr::accumulate():
dat <- data.frame(ID = c(1,1,1,2,2), message = c(53,54,55,53,58))
library(dplyr)
library(purrr)
dat %>%
group_by(ID) %>%
mutate(message_used = accumulate(message, ~ paste(.x, .y, sep = ",")))
#> # A tibble: 5 x 3
#> # Groups: ID [2]
#> ID message message_used
#> <dbl> <dbl> <chr>
#> 1 1 53 53
#> 2 1 54 53,54
#> 3 1 55 53,54,55
#> 4 2 53 53
#> 5 2 58 53,58
Created on 2022-05-11 by the reprex package (v2.0.1)
Я думаю toString(.x .y) немного проще
@GuedesBF: Я думаю, что это должно быть toString(c(.x, .y)), но это определенно еще один, еще более короткий вариант. Я оставляю общую версию с paste, так как она более настраиваема.
Вы можете использовать Reduce(..., accumulate = TRUE) из base:
library(dplyr)
df %>%
group_by(ID) %>%
mutate(messages_used = Reduce(\(x, y) paste(x, y, sep = ", "), message, accumulate = TRUE)) %>%
ungroup()
# # A tibble: 5 x 3
# ID message messages_used
# <int> <int> <chr>
# 1 1 53 53
# 2 1 54 53, 54
# 3 1 55 53, 54, 55
# 4 2 53 53
# 5 2 58 53, 58
Если ID 1 имеет 3 строки и его третье значение равно 55, каков ожидаемый результат?
54,55или53,54,55?