Я бы сделал это с помощью пакета data.table, поскольку это именно то, к чему я привык.
library(data.table)
dt.1 <- data.table("id" = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3), "value_a" = c(0, 10, 21, 30, 43, 53, 69, 81, 93, 5, 16, 27, 33, 45, 61, 75, 90, 2, 11, 16, 24, 31, 40, 47, 60, 75, 88), "value_b" = c(100, 101, 100, 95, 90, 104, 88, 84, 75, 110, 105, 106, 104, 95, 109, 96, 89, 104, 104, 104, 103, 106, 103, 101, 99, 98, 97), "value_c" = c(0, -1, -2, -2, -2, -2, -1, -1, 0, 0, 0, 0, 1, 1, 2, 2, 1, -1, 0, 0, 1, 1, 2, 2, 1, 1, 0), "value_d" = c(1:27))
dt.2 <- data.table("id" = c(1, 2, 3), "value_a1" = c(21, 33, 16), "value_a2" = c(69, 75, 60))
dt.3 <- dt.1[id %in% dt.2[,id],max(value_b), by="id"]
setnames(dt.3, "V1", "max_value_b")
dt.3
Чтобы получить соответствующую строку, где b - максимальные значения, есть несколько способов, вот тот, где я только измененная строка из предыдущего кода
dt.1[id %in% dt.2[,id],.SD[which.max(value_b), .(value_a, value_b, value_c, value_d)], by="id"]
.SD
означает подтаблицу, которую вы уже выбрали с помощью by
, поэтому для каждого идентификатора выбирается локальный max b, а затем возвращается таблица which.max()
выбирает row и, наконец, .()
- это псевдоним для списка, поэтому перечисляются столбцы, которые вы sh из этой таблицы.
Возможно, более удобочитаемым подходом будет сначала выбрать нужные строки
max.b.rows <- dt.1[id %in% dt.2[,id], which.max(value_b), by="id"][,V1]
dt.3 <- dt.1[max.b.rows,]
Кстати, часть id %in% dt.2[,id]
предназначена только для того, чтобы убедиться, что вы выбираете максимумы только для тех идентификаторов в таблице 2
Best