给定具有任意行数和列数的数据框或矩阵,将函数应用于所有成对列组合的最快方法是什么?
例如,如果我有一个数据表:
N <- 3
K <- 3
data <- data.table(id=seq(N))
for(k in seq(K)) {
data[[k]] <- runif(N)
}
我想计算所有列对之间的简单差异,我可以循环(或lapply
)在列上:
differences = data.table(foo=seq(N))
for(var1 in names(data)) {
for(var2 in names(data)) {
if (var1==var2) next
if (which(names(data)==var1)>which(names(data)==var2)) next
combo <- paste0(var1, var2)
differences[[combo]] <- data[[var1]]-data[[var2]]
}
}
但随着 K 变大,这会变得异常缓慢。
我考虑过的一种解决方案是使用以下命令创建两个新数据表combn
并减去它们:
a <- data[,combn(colnames(data),2)[1,],with=F]
b <- data[,combn(colnames(data),2)[2,],with=F]
differences <- a-b
但随着 N 和 K 变大,这会变得非常占用内存(尽管比循环更快)。
在我看来,矩阵与其自身的外积可能是最好的方法,但我无法将其拼凑在一起。如果我想应用任意函数(例如 RMSE)而不仅仅是差值,这尤其困难。
最快的方法是什么?