Ваше начальное семя не сработало для меня - в моем первом ряду был галстук, поэтому мое решение не сработало.
library(data.table)
set.seed(46) #changed
dt <- data.table(matrix(sample(10, 23746*7, TRUE), ncol = 7))
setnames(dt, c('V2', 'V3', 'V4'), c('D1', 'D2', 'D3'))
cols <- c('D1', 'D2', 'D3')
max_dt <- dt[, .(ID = 1:.N
,max_col = apply(.SD, 1
, function (x) {
maxes <- which(x == max(x))
ifelse((length(maxes) != 1), NA_integer_, maxes)
}
)
)
, .SDcols = cols]
#Could still be a null in the first value - you'd have to determine what you want.
max_dt[, max_col := zoo::na.locf(max_col)]
max_dt
dcast(max_dt, ID ~ max_col, fun.aggregate = length, value.var = 'max_col', fill = 0)
dt[, (cols) := dcast(max_dt, ID ~ max_col, fun.aggregate = length, value.var = 'max_col', fill = 0 )[, -1]]
dt
До:
V1 D1 D2 D3 V5 V6 V7
1: 2 3 4 6 9 8 2
2: 3 6 2 9 6 3 3
3: 6 4 3 7 6 9 10
4: 4 8 7 10 7 7 10
5: 3 7 10 8 6 1 5
---
23742: 10 6 7 10 7 3 3
23743: 9 4 10 3 4 7 9
23744: 1 9 1 8 10 8 2
23745: 8 6 6 8 7 4 8
23746: 7 3 7 8 8 10 4
После:
V1 D1 D2 D3 V5 V6 V7
1: 2 0 0 1 9 8 2
2: 3 0 0 1 6 3 3
3: 6 0 0 1 6 9 10
4: 4 0 0 1 7 7 10
5: 3 0 1 0 6 1 5
---
23742: 10 0 0 1 7 3 3
23743: 9 0 1 0 4 7 9
23744: 1 1 0 0 10 8 2
23745: 8 0 0 1 7 4 8
23746: 7 0 0 1 8 10 4