如何根据参考数据框在给定条件下填充空白矩阵?

How do I fill a blank matrix given conditions from a refernce dataframe?

我正在尝试组织一个矩阵,显示诱捕集中的哪些个体被一起捕获。 目前我有一个空白矩阵,其中的行和列以数据集中的每个人命名

my_sociomatrix = matrix(, nrow = 389, ncol = 389)
diag(my_sociomatrix) <- 0

names_list<- unique(df$individual)
names_list
rownames(my_sociomatrix)<-names_list
colnames(my_sociomatrix)<-names_list

我想做的是根据个体被抓到一起的次数分配“1、2、3……或 0”。

我有一个单独的数据框,其中包含确定哪些人在每个诱捕事件中被捕获所需的信息。有些人被多次抓到,所以他们出现不止一次。

individual trap event
NA002 A
NA03,41 A
NA03,42 B
NA03,41 C
NA03,42 C
NA03,43 C
NA002 D
NA03,41 D
NA03,44 D
NA03,45 D

我想使用数据框的引用来填充矩阵,这样矩阵就会像这样填充。我无法手动执行此操作,因为整个矩阵是 389x389 个单元格。

NA002 NA03,41 NA03,42 NA03,43 NA03,44 NA03,45
NA002 -
NA03,41 2 -
NA03,42 0 1 -
NA03,43 0 1 1 -
NA03,44 1 1 0 0 -
NA03,45 1 1 0 0 1 -

个体 NA002 和 NA03,41 被抓在一起两次,所以他们被分配了 2。个体 NA002 和 NA03,42 从未被抓在一起,所以他们得到了 0。个体 NA002 和 NA03,44 被抓在一起一次, 所以他们得到 1,依此类推...

如何使用基于我的数据框的条件来填写我的矩阵?我已经使用 R 几年了,但这种类型的工作对我来说是全新的,因为我以前从未接触过矩阵。

我在考虑使用 basic

net[,]= 但带有 ifelse 语句,但我不确定如何执行此操作。

获取个人分享陷阱事件的频率

 library(dplyr)
 library(tidyverse)
df = data.frame(individual = c("NA002","NA03,41","NA03,42","NA03,41","NA03,42","NA03,43","NA002","NA03,41","NA03,44","NA03,45"),"trap event" = c("A","A","B","C","C","C","D","D","D","D"))

      df %>% mutate(n = 1) %>% 
      spread(individual, n, fill=0) %>% 
      select(-trap_event) %>% 
      {crossprod(as.matrix(.))} %>% 
      `diag<-`(0)

输出:

       NA002 NA03,41 NA03,42 NA03,43 NA03,44 NA03,45
NA002       0       2       0       0       1       1
NA03,41     2       0       1       1       1       1
NA03,42     0       1       0       1       0       0
NA03,43     0       1       1       0       0       0
NA03,44     1       1       0       0       0       1
NA03,45     1       1       0       0       1       0

谢谢 cgvoller,你的代码很棒。这是任何感兴趣的人的略微编辑的代码。如果您不能在原始 df 的一行子集中写出您的 df,那么它只有您需要的两列。

df2 <- Rsnappers[, c("trap_event", "individual")]
head(df2)

df2 %>% mutate(n = 1) %>% 
  spread(individual, n, fill=0) %>% 
  select(-trap_event) %>% 
  {crossprod(as.matrix(.))} %>% 
  `diag<-`(0)

#add to matrix
my_sociomatrix <- df2 %>% mutate(n = 1) %>% 
  spread(individual, n, fill=0) %>% 
  select(-trap_event) %>% 
  {crossprod(as.matrix(.))} %>% 
  `diag<-`(0)```