不知道你有多大的數據。我想你想矢量化,以優化性能。在這裏你有一個可能的解決方案,使用slqdf
。
(我看着像data.table
辦法,但我沒有成功與你的條件是Y執行笛卡爾積!= Y上的連接每側...)
首先我創建了一個玩具數據幀和用你的代碼運行它。
library(tilting)
data <- data.frame(p1=seq(1, 6), p2=seq(12, 17), p3=seq(14,9), Y=c(rep(0,3), rep(1,3)))
g <- vector();
n <- nrow(data)
p <- 3
for(i in 1:n){
temp <- t(data[data$Y[i] != data$Y, 1:p]) - as.vector(t(data[i,1:p]))
g[i]<- min(col.norm(temp))
}
凡克的結果是,
[1] 5.196152 3.464102 1.732051 1.732051 3.464102 5.196152
然後我添加索引使用rownames
數據並執行笛卡爾乘積,
data$idx <- rownames(data)
library(sqldf)
predictors <- c("p1", "p2", "p3")
cart <- sqldf(paste0("select d1.idx,",
paste("d1", predictors, collapse=",", sep="."), ",",
paste("d2", predictors, collapse=",", sep="."),
" from data as d1",
" join data as d2",
" on d1.Y != d2.Y"))
然後,我計算出你的功能,
cart$d <- sqrt(rowSums((cart[, 2:4] - cart[, 5:7])^2))
和最小化就像彙總結果一樣。
> aggregate(cart, by=list(cart$idx), FUN=min)[, c("idx", "d")]
idx d
1 1 5.196152
2 2 3.464102
3 3 1.732051
4 4 1.732051
5 5 3.464102
6 6 5.196152
正如我所說,不確定你的目標,但我希望它有幫助。
嗨! StackOverflow不可視化乳膠,您可以使用[this](http://www.codecogs.com/latex/eqneditor.php)作爲解決方法(複製粘貼結果公式)。請修正你的公式,因爲現在它不可讀。也請爲您的功能提供最佳嘗試(無論是矢量化還是非矢量化)。謝謝。 – lrnzcig
感謝您的建議,我已經修復了配方,並且現在也添加了我自己的嘗試。 – ChuckP