Преобразование таблицы расстояний ближайшего соседа в матрицу

У меня есть кадр данных, созданный при вычислении ближайшего соседа (K = 2) с использованием пакета RANN. Я хотел бы преобразовать эти данные в матрицу со значениями 0,1,2 для каждой ячейки с 0 = не сосед, 1 = ближайший сосед, 2 = 2-й ближайший сосед.

Фрейм данных состоит из двух столбцов, первый столбец - это идентификатор 1-го NN, второй столбец - это идентификатор 2-го NN. Строки соответствуют идентификатору точки, из которой был вычислен NN.

Есть ли существующая процедура, позволяющая легко осуществить такую ​​трансформацию?

Спасибо


person scuerda    schedule 26.01.2013    source источник
comment
Воспроизводимость отличная.   -  person user1317221_G    schedule 27.01.2013


Ответы (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))

person user1317221_G    schedule 26.01.2013
comment
Это сработало отлично, хотя и немного усложнило обработку. Спасибо и извините за то, что не включили образцы данных. - person scuerda; 27.01.2013
comment
рад, что это сработало, просто хочу сказать, что может быть лучше превратить NN1 и т. д. на числа до dcast, а не после. Итак, hold <- within(hold, variable <- ifelse(variable == "NN1",1,ifelse(variable == "NN2",2,0))), прежде чем вы сделаете hold2 - person user1317221_G; 27.01.2013

Другой вариант, но не особенно красивее. Спасибо @ 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
person juba    schedule 26.01.2013