Что вы хотите сделать, если у вас есть несколько действительных ответов для одной и той же группы?Вам нужен какой-то механизм агрегирования, например, min / max / average / etc.Вот одно решение для вас, использующее операторы by
и .SD
в data.table
.В моем примере я беру max
из x1
, x2
и x3
из id
.Это сворачивает три ряда на id
в один.
library(data.table)
dt <- data.table(id = rep(1:4, each = 3), x1 = c(1,NA,2,NA,3,NA,4,NA,5,NA,6,NA), x2 = c(NA,6,NA,5,NA,4,NA,3,NA,2,NA,NA), x3 = c(12,NA,NA,11, NA, NA, 10, NA,NA,NA, NA, NA))
dt[, lapply(.SD, max, na.rm = TRUE),keyby = id]
#> Warning in gmax(x3, na.rm = TRUE): No non-missing values found in at least
#> one group. Returning '-Inf' for such groups to be consistent with base
#> id x1 x2 x3
#> 1: 1 2 6 12
#> 2: 2 3 5 11
#> 3: 3 5 3 10
#> 4: 4 6 2 -Inf
Создано в 2019-02-23 с помощью пакета представитель (v0.2.1)
Обратите внимание на предупреждение: -Inf
которые вы могли бы убрать после факта легко.