Как создать симметричный фрейм данных в R на основе другого симметричного фрейма данных - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть этот фрейм данных.

df <- data.frame(product=c("A", "B", "C", "D", "E"), ID=c(1,1,2,2,1))

enter image description here

и другой (симметричный) фрейм данных.

ID_table <- data.frame("ID 1" = c(10, 50), "ID 2" = c(50, 10))

enter image description here

Как создать фрейм данных уровня продукта 5 на 5 на основе значения идентификатора?

Вот требуемый вывод:

enter image description here

Число от A до B равно 10, потому что A и B имеют одинаковый ID = 1.Число от A до C равно 50, потому что A имеет ID 1, но C имеет ID 2.

Ответы [ 2 ]

3 голосов
/ 17 апреля 2019

Вы можете использовать table и tcrossprod, чтобы получить следующее

out <- tcrossprod(table(df))
out
#       product
#product A B C D E
#      A 1 1 0 0 1
#      B 1 1 0 0 1
#      C 0 0 1 1 0
#      D 0 0 1 1 0
#      E 1 1 0 0 1

Теперь вам нужно всего лишь заменить значения на 10 и 50

as.data.frame(ifelse(out == 1, 10, 50))
#   A  B  C  D  E
#A 10 10 50 50 10
#B 10 10 50 50 10
#C 50 50 10 10 50
#D 50 50 10 10 50
#E 10 10 50 50 10

Результат table(df) равен

table(df)
#       ID
#product 1 2
#      A 1 0
#      B 1 0
#      C 0 1
#      D 0 1
#      E 1 0

Хотя результат tcrossprod(table(df)) совпадает с результатом

table(df) %*% t(table(df))
2 голосов
/ 17 апреля 2019

Вот попытка с помощью outer сгенерировать комбинации каждого df$ID и использовать их для подмножества вашего ID_table:

idnm <- setNames(df$ID,df$product)
o <- outer(idnm, idnm, FUN=function(x,y) ID_table[cbind(x,y)] )
o
#   A  B  C  D  E
#A 10 10 50 50 10
#B 10 10 50 50 10
#C 50 50 10 10 50
#D 50 50 10 10 50
#E 10 10 50 50 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...