Вы можете суммировать каждый столбец по группе.
library(dplyr)
df %>%
group_by(id) %>%
summarise(var1 = first(var1),
var2 = if(all(is.na(var2))) NA else na.omit(var2),
var3 = if(all(is.na(var3))) NA else na.omit(var3),
var4 = toString(sort(var4)),
var5 = na_if(toString(var5[number == 7]), ""),
number = 7)
# # A tibble: 4 x 7
# id var1 var2 var3 var4 var5 number
# <fct> <fct> <int> <int> <chr> <chr> <dbl>
# 1 id01 a 3 6 4, 9 NA 7
# 2 id02 b 6 22 4, 7, 8, 9 8, 6 7
# 3 id03 c 9 33 4, 7, 9 9 7
# 4 id04 d 7 98 4, 7, 8, 9 2 7
Примечание: number
должно быть указано после var5
. Если вы установите number = 7
перед var5
, тогда значения в number
будут переопределены как 7, так что var5 = var5[number == 7]
не будет работать.
Data
df <- structure(list(id = structure(c(1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L,
3L, 4L, 4L, 4L, 4L), .Label = c("id01", "id02", "id03", "id04"
), class = "factor"), number = c(2L, 7L, 2L, 4L, 5L, 7L, 2L,
6L, 7L, 2L, 3L, 4L, 7L), var1 = structure(c(1L, 1L, 2L, 2L, 2L,
2L, 3L, 3L, 3L, 4L, 4L, 4L, 4L), .Label = c("a", "b", "c", "d"
), class = "factor"), var2 = c(NA, 3L, NA, NA, NA, 6L, NA, NA,
9L, NA, NA, NA, 7L), var3 = c(6L, NA, 22L, NA, NA, NA, 33L, NA,
NA, 98L, NA, NA, NA), var4 = c(4L, 9L, 4L, 7L, 9L, 8L, 4L, 9L,
7L, 9L, 4L, 7L, 8L), var5 = c(5L, 8L, NA, 4L, 8L, 6L, 1L, 3L,
9L, 2L, NA, NA, 2L)), class = "data.frame", row.names = c(NA, -13L))