R中隶属矩阵的数据帧

时间:2018-12-07 16:00:35

标签: r dplyr data-manipulation

HAVE是具有以下结构的数据框:

name workplace pr_happy
a     A            0.93
b     B            0.54
c     A            0.72
d     C            0.17
e     D            0.44

WANT建立姓名和工作场所的邻接矩阵(正像这个问题:converting data frame into affiliation network in R),但是我希望使用pr_happy的值来代替具有二进制值的矩阵填充每个隶属关系的单元格。 WANT应该看起来像这样:

       A    B    C    D 
a   0.93 0.00 0.00 0.00
b   0.00 0.54 0.00 0.00
c   0.72 0.00 0.00 0.00
d   0.00 0.00 0.17 0.00
e   0.00 0.00 0.00 0.44

我很难用一种简单的方法来解决问题。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

这本质上是透视和替换NA

使用tidyverse

library(tidyverse)

dat %>% 
  spread(workplace, pr_happy, fill = 0) %>% # thank you @Jordo82
  tibble::column_to_rownames("name")

     A    B    C    D
a 0.93 0.00 0.00 0.00
b 0.00 0.54 0.00 0.00
c 0.72 0.00 0.00 0.00
d 0.00 0.00 0.17 0.00
e 0.00 0.00 0.00 0.44

数据

dat <- structure(list(name = c("a", "b", "c", "d", "e"),
                      workplace = c("A", "B", "A", "C", "D"),
                      pr_happy = c(0.93, 0.54, 0.72, 0.17, 0.44)),
                 .Names = c("name", "workplace", "pr_happy"),
                 row.names = c(NA, -5L), class = c("data.frame"))

答案 1 :(得分:2)

您可以这样做:

WANT=matrix(data = 0,nrow = 5,ncol = 4)
rownames(WANT)=letters[1:5]
colnames(WANT)=LETTERS[1:4]

for ( i in 1:5){
   WANT[HAVE[i,1],HAVE[i,2]]=HAVE[i,3]
}

(尽管我确信有一种方法可以避免循环)