2016-01-23 59 views
1

在从randomForest获得接近矩阵后,对于数据集中的每一行/观测,我想找到k个最近点(不包括观测本身,或,等价地,接近矩阵的对角线元素),然后是它们的真实类别标签。我知道如何找到矩阵中每行的最大值或最小值的索引,但我不知道如何对R进行编程以排除对角线元素,并按行确定k个最大的项。从R中的接近矩阵按行获得k阶统计

> set.seed(1234) 
> d <- iris[sample(nrow(iris), 6, replace = FALSE),] 
> iris.rf <- randomForest(Species ~ ., data=d, ntree=2000, proximity=TRUE, oob.prox=TRUE) 
> m <- iris.rf$proximity 
> m 
      18  93  91  92  126  149 
18 1.0000000 0.7486911 0.7653631 0.7500000 0.2620690 0.4723926 
93 0.7486911 1.0000000 0.7836257 0.7329545 0.5497076 0.2763819 
91 0.7653631 0.7836257 1.0000000 0.6795580 0.5371429 0.2289157 
92 0.7500000 0.7329545 0.6795580 1.0000000 0.3107345 0.4535519 
126 0.2620690 0.5497076 0.5371429 0.3107345 1.0000000 0.8115942 
149 0.4723926 0.2763819 0.2289157 0.4535519 0.8115942 1.0000000 

> which(m[1,] == max(m[1,]), arr.ind = TRUE) 
18 
1 
+0

SO是关于帮助。请写一个可重现的例子,其中包括您的数据集的子集和您一直在处理的代码。 – MLavoie

回答

0

我能够自己解决它,但如果有一种方法来改善代码(或者如果有错误),我将不胜感激反馈。

f = function(d,k){ 
m <- randomForest(y ~ ., data=d, ntree=2000, proximity=TRUE, oob.prox=TRUE)$proximity 
diag(m) <-0 
tmp <- lapply(as.list(as.data.frame(m)),order,decreasing = TRUE) 
tmp1 <- t(as.data.frame(tmp))[,c(1:k)] 
class.mat <- matrix(data=NA,nrow(d), k, byrow=TRUE) 

for(i in 1:nrow(d)){ 

    class.mat[i,] = d$y[tmp1[i,]] 
} 
return(class.mat) 
}