【问题标题】:How do I fill a blank matrix given conditions from a refernce dataframe?如何从参考数据框中填充给定条件的空白矩阵?
【发布时间】:2025-12-28 13:50:06
【问题描述】:

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

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 几年了,但这种类型的工作对我来说是全新的,因为我以前从未使用过矩阵。

我正在考虑使用基本的

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

【问题讨论】:

    标签: r matrix conditional-formatting


    【解决方案1】:

    这会获取个人共享陷阱事件的频率

     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
    

    【讨论】:

    • 我不确定为什么,但我收到的代码错误是“UseMethod("mutate") 中的错误:没有适用于 'mutate' 的方法应用于类对象“c('matrix', ' double', '数字')"
    • 我添加了对数据框的引用,但它仍然无法运行。 my_sociomatrix %>% mutate(n = 1) %>% spread(df$individual, n, fill=0) %>% select(-df$trap_event) %>% {crossprod(as.matrix(.))} % >%diag&lt;-(0)
    • 你不需要在 dplyr 中使用 $ 来引用,我已经编辑了代码。输入您的数据框(我称为 df),其中包含管道 %>% 之前的个人和陷阱事件两列。这将输出一个如图所示的数据帧,如果要转换为矩阵,请执行 as.matrix()。希望这会有所帮助!
    【解决方案2】:

    感谢 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)```
    

    【讨论】: