按列标准化:data.table方式

Thr*_*iag 3 r data.table

从简单的数据表开始

ID MAX X1 X2 X3 X4
E0 9   2  1  2  3
E0 21  9  0  10 2
Run Code Online (Sandbox Code Playgroud)

我想将所有列标准化X1X4除以MAX.

这种不受欢迎的data.frame方式将是

dt$X1 <- dt$X1/dt$MAX
Run Code Online (Sandbox Code Playgroud)

什么是优雅的数据表方式?

我尝试过dt[, .SD/MAX, by = ID],但这也将MAX降低到1.

akr*_*run 6

使用data.table v1.9.7,我们还可以指定列.SDcols,循环遍历列(lapply(.SD, ...),除以'MAX'并将:=输出分配()返回到感兴趣的列.

dt[, paste0("X", 1:4) := lapply(.SD, `/`, MAX), .SDcols= X1:X4]
dt
#   ID MAX        X1        X2        X3        X4
#1: E0   9 0.2222222 0.1111111 0.2222222 0.3333333
#2: E0  21 0.4285714 0.0000000 0.4761905 0.0952381
Run Code Online (Sandbox Code Playgroud)