是否可以使用data.table通过许多组变量来标准化多个变量?
DT <- data.table(V1=1:20, V2=40:21, gr=c(rep(c('a'),10), rep(c('b'),10)),
grr=rep(c(rep(c('a'),5), rep(c('b'),5)),2))
gr和grr是组变量。我想添加到data.table V1.z和V2.z,它们是每个gr-by-grr组中的标准化分数。
这是一个极其愚蠢的代码,用于解释我想要的内容:
DTaa <- DT[gr=='a' & grr=='a',]
DTab <- DT[gr=='a' & grr=='b',]
DTba <- DT[gr=='b' & grr=='a',]
DTbb <- DT[gr=='b' & grr=='b',]
DTaa <- DTaa[,V1.z := scale(V1)]
DTaa <- DTaa[,V2.z := scale(V2)]
DTab <- DTab[,V1.z := scale(V1)]
DTab <- DTab[,V2.z := scale(V2)]
DTba <- DTba[,V1.z := scale(V1)]
DTba <- DTba[,V2.z := scale(V2)]
DTbb <- DTbb[,V1.z := scale(V1)]
DTbb <- DTbb[,V2.z := scale(V2)]
DTn <- rbind(DTaa, DTab, DTba, DTbb)
可能有一种方法可以在一行或两行中使用by
。
答案 0 :(得分:3)
按照&#39; gr&#39;分组后和&#39; grr&#39;循环遍历Data.table的子集(.SD
),scale
它(scale
的输出是matrix
,所以我们使用vector
将其转换为as.vector
并将输出(:=
)分配给新列。
DT[, paste0(names(DT)[1:2], ".z") := lapply(.SD,
function(x) as.vector(scale(x))), .(gr, grr)]