В зависимости от ваших данных, это может быть более эффективным и давать имена столбцам в явном виде:
library(data.table)
DT <- data.table(grp = rep(LETTERS[1:3], 3),
val = 1:9,
val2 = rep(letters[24:26], each = 3))
agg <- DT[, .SD[which.min(val)], grp]
DT[, val3 := "New Value"]
repcols <- setdiff(colnames(agg), "grp")
DT[, (repcols) := agg[DT, .SD, on = .(grp), .SDcols=repcols]][]
#> grp val val2 val3
#> 1: A 1 x New Value
#> 2: B 2 x New Value
#> 3: C 3 x New Value
#> 4: A 1 x New Value
#> 5: B 2 x New Value
#> 6: C 3 x New Value
#> 7: A 1 x New Value
#> 8: B 2 x New Value
#> 9: C 3 x New Value
Редактировать: В зависимости от дополнительного вопроса, изменение по ссылке может, например, быть непосредственно достигнутым, как это:
library(data.table)
DT <- data.table(grp = rep(LETTERS[1:3], 3),
val = 1:9,
val2 = rep(letters[24:26], each = 3))
keepcols <- setdiff(colnames(DT), "grp")
DT[, val3 := letters[1:9]]
# if you want to keep all of val3; otherwise switch the previous two lines
DT[, (keepcols) := .SD[which.min(val)], by=.(grp), .SDcols=keepcols][]
#> grp val val2 val3
#> 1: A 1 x a
#> 2: B 2 x b
#> 3: C 3 x c
#> 4: A 1 x d
#> 5: B 2 x e
#> 6: C 3 x f
#> 7: A 1 x g
#> 8: B 2 x h
#> 9: C 3 x i
Создано в 2020-04-24 с помощью представительного пакета (v0.3.0)