【问题标题】:Transforming a table of Nearest Neighbor Distances into a Matrix将最近邻距离表转换为矩阵
【发布时间】:2013-01-27 05:57:48
【问题描述】:

我有一个使用 RANN 包计算最近邻 (K=2) 生成的数据框。我想将此数据转换为一个矩阵,每个单元格的值为 0,1,2,其中 0 = 非邻居,1=最近邻居,2=第二最近邻居。

数据框有两列,第一列是第一个NN的ID,第二列是第二个NN的ID。这些行对应于计算 NN 的点的 ID。

是否有现有的例程可以轻松进行这种转换?

谢谢

【问题讨论】:

标签: r matrix nearest-neighbor


【解决方案1】:

基于您给出的有限想法,我认为,这是一个不漂亮的解决方案:

 NNdf <- data.frame(NN1=c(1,2,4),NN2=c(2,3,1)) # make up some data
 NNdf$origin <- rownames(NNdf)

 NNdf
#  NN1 NN2 origin
#1   1   2      1
#2   2   3      2
#3   4   1      3


 library(reshape2)
 hold <- melt(NNdf, id = "origin")
 hold
#  origin variable value
#1      1      NN1     1
#2      2      NN1     2
#3      3      NN1     4
#4      1      NN2     2
#5      2      NN2     3
#6      3      NN2     1


 hold2 <- dcast(hold, origin~value, value.var="variable")

 hold2[hold2 == "NN1"]  <- 1
 hold2[hold2 == "NN2"]  <- 2
 hold2[is.na(hold2) ]   <- 0

 hold2
#  origin 1 2 3 4
#1      1 1 2 0 0
#2      2 0 1 2 0
#3      3 2 0 0 1

(这之后可能依赖apply(hold2,1,as.numeric)

【讨论】:

  • 这工作得很好,如果不是有点繁重的处理。感谢并抱歉没有包含示例数据。
  • 很高兴它起作用了,只是说将NN1等转换为dcast之前而不是之后的数字可能会更好。所以hold &lt;- within(hold, variable &lt;- ifelse(variable == "NN1",1,ifelse(variable == "NN2",2,0))) 在你做hold2之前
【解决方案2】:

另一种可能,但不是特别漂亮。感谢@user1317221_G 提供示例数据!

NNdf <- data.frame(NN1=c(1,2,4,3),NN2=c(2,3,1,2))
NNdf$origin <- as.numeric(rownames(NNdf))
NNdf

  NN1 NN2 origin
1   1   2      1
2   2   3      2
3   4   1      3
4   3   2      4

res <- matrix(0,nrow(NNdf),nrow(NNdf))
res[as.matrix(NNdf[,c("origin","NN1")])] <- 1
res[as.matrix(NNdf[,c("origin","NN2")])] <- 2
res

     [,1] [,2] [,3] [,4]
[1,]    1    2    0    0
[2,]    0    1    2    0
[3,]    2    0    0    1
[4,]    0    2    1    0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 2021-08-07
    • 1970-01-01
    • 2021-05-19
    • 2021-04-24
    • 2014-06-20
    相关资源
    最近更新 更多