R 将data.table行除以总平均值

R 将data.table行除以总平均值,r,data.table,R,Data.table,考虑以下几点 mtcars.dt <- data.table(mtcars) DT1 = mtcars.dt[, lapply(.SD, mean), by=cyl] DT2 = mtcars.dt[, lapply(.SD, mean)] 及 现在,我想让DT1中每一行的mpg,disp,…,通过整个原始表的平均值进行规范化(在DT2中提供) 我该怎么做?这里正确的成语是什么 编辑:这里是所需的输出,很抱歉,我之前不清楚 cyl mpg disp

考虑以下几点

mtcars.dt <- data.table(mtcars)
DT1 = mtcars.dt[, lapply(.SD, mean), by=cyl]
DT2 = mtcars.dt[, lapply(.SD, mean)]

现在,我想让DT1中每一行的mpg,disp,…,通过整个原始表的平均值进行规范化(在
DT2
中提供)

我该怎么做?这里正确的成语是什么

编辑:这里是所需的输出,很抱歉,我之前不清楚

    cyl      mpg      disp        hp      drat        wt      qsec       vs        am      gear      carb
1:    6 0.9826900 0.7945249 0.8336478 0.9969837 0.9688843 1.0071934 1.306122 1.0549451 1.0460048 1.2190476
2:    4 1.3271681 0.4556844 0.5633497 1.1318889 0.7104599 1.0721912 2.077922 1.7902098 1.1093991 0.5494949
3:    8 0.7515943 1.5304141 1.4262584 0.8978812 1.2430536 0.9396817 0.000000 0.3516484 0.8910412 1.2444444

但这只是数据帧ly

这里有一个可能的更
数据表
ish解决方案,它使用了高效的
设置
功能(我使用的是CRAN btw-v 1.9.6上最新的
数据表
版本)

创建
DT1

library(data.table) # V 1.9.6+
mtcars.dt <- data.table(mtcars)
DT1 <- mtcars.dt[, lapply(.SD, mean), by = cyl]
现在在
DT1
中的第二列上循环,并在被
DT2
中的元素除以的同时将
DT1
更新到位

for (j in 2L:length(DT1)) set(DT1, j = j, value = DT1[[j]]/DT2[j - 1L])
DT1
#    cyl       mpg      disp        hp      drat        wt      qsec       vs        am      gear      carb
# 1:   6 0.9826900 0.7945249 0.8336478 0.9969837 0.9688843 1.0071934 1.306122 1.0549451 1.0460048 1.2190476
# 2:   4 1.3271681 0.4556844 0.5633497 1.1318889 0.7104599 1.0721912 2.077922 1.7902098 1.1093991 0.5494949
# 3:   8 0.7515943 1.5304141 1.4262584 0.8978812 1.2430536 0.9396817 0.000000 0.3516484 0.8910412 1.2444444

每行的标准化是否可以通过cyl聚合解决您的问题

就像这样:
mtcars.dt请尝试
DT1[,-1,with=FALSE]/unlist(DT2[,-2,with=FALSE])[col(DT1)]
@davidernburg谢谢,但是我如何在结果中返回cyl列?您能显示您想要的输出吗?不太好clear@DavidArenburg抱歉,刚刚添加了它。您可以执行
cbind(DT1[,(cyl)],DT1[,-1,with=FALSE]/unlist(DT2[,-2,with=FALSE])[col(DT1)])
但我觉得这不是很
数据表。让我先做点更好的
mapply('/',subset(DT1, select=-cyl), subset(DT2, select=-cyl))
library(data.table) # V 1.9.6+
mtcars.dt <- data.table(mtcars)
DT1 <- mtcars.dt[, lapply(.SD, mean), by = cyl]
DT2 <- unlist(mtcars.dt[, lapply(.SD, mean), .SDcols = -"cyl"])
for (j in 2L:length(DT1)) set(DT1, j = j, value = DT1[[j]]/DT2[j - 1L])
DT1
#    cyl       mpg      disp        hp      drat        wt      qsec       vs        am      gear      carb
# 1:   6 0.9826900 0.7945249 0.8336478 0.9969837 0.9688843 1.0071934 1.306122 1.0549451 1.0460048 1.2190476
# 2:   4 1.3271681 0.4556844 0.5633497 1.1318889 0.7104599 1.0721912 2.077922 1.7902098 1.1093991 0.5494949
# 3:   8 0.7515943 1.5304141 1.4262584 0.8978812 1.2430536 0.9396817 0.000000 0.3516484 0.8910412 1.2444444
# normalise by cyl
sdcol <- names(mtcars.dt)[names(mtcars.dt) != "cyl"]
res <- mtcars.dt[, lapply(.SD, function(x) x / mean(x)), .SDcols = sdcol]
res[, cyl := mtcars.dt[, cyl]]

# aggregate
res2 <- res[, lapply(.SD, mean), by = cyl]
mtcars.dt[, lapply(.SD, function(x) x / mean(x)), .SDcols = sdcol][, cyl := mtcars.dt[, cyl]][, lapply(.SD, mean), by = cyl]