我有一个名为“ 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]])]
}
答案 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