首页 文章

使用data.table按组标准化

提问于
浏览
2

是否可以使用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 在一行或两行中完成 .

  • 我希望在接受数据的函数中使用它,目标变量(在示例中为V1和V2)和组变量(在示例中为gr和grr)作为参数 .

  • 如果您的解决方案不使用data.table,那么's also good (I tried using mutate_at from dplyr but couldn' t找不到关于该函数的大量文档 .

1 回答

  • 3

    在按'gr'和'grr'进行分组后,循环遍历Data.table( .SD )的子集, scale 它( scale 的输出是 matrix ,所以我们将其转换为带有 as.vectorvector )并将输出分配( := )到新列 .

    DT[, paste0(names(DT)[1:2], ".z") := lapply(.SD, 
                      function(x) as.vector(scale(x))), .(gr, grr)]
    

相关问题