R中隶属矩阵的数据帧

R中隶属矩阵的数据帧,r,dplyr,data-manipulation,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 我希望构建名称和工作场所的邻接矩阵(与此问题完全相同:),但我希望用pr_happy的值填充每个从属关系的单元格,而不是使用二进制值的矩阵WANT应如下所示: A

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
希望
构建名称和工作场所的邻接矩阵(与此问题完全相同:),但我希望用
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

我很难找到一个简单的方法来解决这个问题。有什么想法吗?

这本质上是旋转和替换
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这实质上是旋转和替换
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您可以这样做:

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]
}

(尽管我确信有一种方法没有循环)

你可以这样做:

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]
}

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

您调用spread时也使用
fill
参数将NA替换为0:
spread(workplace,pr_happy,fill=0)
您调用spread时也使用
fill
参数将NA替换为0:
spread(workplace,pr_happy,fill=0)
做出一些假设(
name
workplace
列是因子,因子级别的顺序与
WANT
中的行和列顺序相同),然后我们可以使用矩阵索引来避免
for
循环。调用输入数据框
df
,然后
HAVE=sapply(df,as.numeric)
WANT[HAVE][,1:2]]=HAVE[,3]
在没有循环的情况下完成分配。这些假设很容易实施,只需让您的
行名(WANT)=级别(df$name);列名(WANT)=级别(df$workplace)
。做一些假设(
name
workplace
列是因子,因子级别的顺序与
WANT
中的行和列顺序相同),然后我们可以使用矩阵索引来避免
for
循环。调用输入数据框
df
,然后
HAVE=sapply(df,as.numeric)
WANT[HAVE][,1:2]]=HAVE[,3]
在没有循环的情况下完成分配。这些假设很容易实施,只需使您的
行名(WANT)=级别(df$name);列名(WANT)=级别(df$workplace)