我有一个使用RANN包计算最近邻居(K = 2)生成的数据帧。我想将这些数据转换为每个单元格的值为0,1,2的矩阵,其中0 =不是邻居,1 =最近邻居,2 =第二最近邻居。
数据框有两列,第一列是第一个NN的ID,第二列是第二个NN的ID。行对应于计算NN的点的ID。
是否存在容易进行此类转换的现有例程?
由于
答案 0 :(得分:2)
基于您给出的有限想法,这里是我认为,一个不合时宜的解决方案:
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)
)
答案 1 :(得分:0)
另一种可能性,但不是特别漂亮。感谢@ 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