R中数据表中均值的偏差

时间:2018-09-27 14:13:16

标签: r data.table

我有一个名为“ dt”的大数据表,我想生成一个尺寸相同的数据表,该数据表与dt中每个条目的行均值产生偏差。

此代码有效,但对我来说似乎很慢。我希望有办法更快地做到这一点?也许我在构建表时出错,所以我没有利用按引用分配。也许这和它一样好?

(我是R新手,因此感谢其他提示!)

这是我的代码:

library(data.table)

r <- 100 # of rows
c <- 100 # of columns

# build a data table with random cols 
# (maybe not the best way to build, but this isn't important)
dt <- data.table(rnorm(r))
for (i in c(1:(c-1))) {
  dt <- cbind(dt,rnorm(r))
}
colnames(dt) <- as.character(c(1:c))

devs <- copy(dt) 
means <- rowMeans(dt)

for (i in c(1:nrow(devs))) {
    devs[i, colnames(devs) := abs(dt[i,] - means[[i]])]
}

2 个答案:

答案 0 :(得分:2)

如果从data.frame(或data.table)中减去一个向量,则该向量将从data.frame的每一列中减去(假设它们都是数字)。像abs这样的数字函数也可以在全数字data.frame上使用。因此,您可以使用

来计算devs
devs <- abs(dt - rowMeans(dt))

您也不需要创建dt的循环,可以使用replicate,该方法将第二个参数复制第一个参数指定的次数,并将结果排列成矩阵(除非将simplify = FALSE用作参数)

dt <- as.data.table(replicate(r, rnorm(r)))

答案 1 :(得分:0)

不知道它是否在寻找什么,但是sweep函数将帮助您应用结合矩阵和向量的运算(如您的行均值)。

table <- matrix(rnorm(r*c), nrow=r, ncol=c) # generate random matrix
means <- apply(table, 1, mean) # compute row means
devs <- abs(sweep(table, 1, means, "-")) # compute by row the deviation from the row mean