преобразовать из длинного в симметричный квадратный широкий формат в R - PullRequest
1 голос
/ 28 апреля 2020

Я хотел бы преобразовать этот фрейм данных

tmp <- data.frame(V1=c("A","A","B"),V2=c("B","C","C"),V3=c(0.2,0.4,0.1))
tmp
  V1 V2  V3
1  A  B 0.2
2  A  C 0.4
3  B  C 0.1

в квадратную матрицу, подобную этой (которая в конечном итоге должна быть dist объектом

  A B C
A 0
B 0.2 0
C 0.4 0.1 0

. Я пробовал разные подходы, основанные на функции reshape, spread или xtabs, но я не могу получить правильное измерение. Спасибо за вашу помощь.

Ответы [ 3 ]

2 голосов
/ 28 апреля 2020

Может быть, вы можете попробовать код ниже

d <- sort(unique(unlist(tmp[1:2])))
m <- `dimnames<-`(matrix(0,length(d),length(d)),list(d,d))
m[as.matrix(tmp[1:2])] <- tmp$V3
res <- t(m) + m

такой, что

> res
    A   B   C
A 0.0 0.2 0.4
B 0.2 0.0 0.1
C 0.4 0.1 0.0
1 голос
/ 28 апреля 2020

Таким способом вы также можете создать свой собственный объект dist, используя structure:

tmp_lab <- unique(c(as.character(tmp$V1), as.character(tmp$V2)))

structure(tmp$V3,
          Size = length(tmp_lab),
          Labels = tmp_lab,
          Diag = TRUE,
          Upper = FALSE,
          method = "user",
          class = "dist")

Выход

    A   B   C
A 0.0        
B 0.2 0.0    
C 0.4 0.1 0.0
0 голосов
/ 28 апреля 2020

Вот вариант с xtabs после преобразования столбцов 'V1', 'V2' в factor с levels, указанным как тот же

tmp[1:2] <- lapply(tmp[1:2], factor, levels = c('A', 'B', 'C'))
as.dist(xtabs(V3 ~ V2 + V1, tmp), diag = TRUE)
#    A   B   C
#A 0.0        
#B 0.2 0.0    
#C 0.4 0.1 0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...