R语言如何根据参考数据框条件填充空白关联矩阵
R语言实现诱捕个体共现矩阵填充
核心逻辑
你需要的共现次数矩阵本质是个体-诱捕事件关联矩阵和其转置矩阵的乘积,向量化运算效率极高,389×389的规模可以毫秒级完成计算,不需要手动写循环或ifelse判断。
实现代码
方法1:基础R实现(无需额外安装包)
# 可选:先过滤掉个体编号为空的无效记录 trap_df <- trap_df[!is.na(trap_df$individual), ] # 生成个体-诱捕事件的0-1交叉表 ind_event_mat <- table(trap_df$individual, trap_df$trap.event) # 矩阵相乘得到共现次数矩阵 my_sociomatrix <- ind_event_mat %*% t(ind_event_mat) # 对角线设为0,符合你的需求 diag(my_sociomatrix) <- 0 # 可选:如果需要严格匹配你之前生成的names_list的行列顺序,加这一行 my_sociomatrix <- my_sociomatrix[names_list, names_list]
方法2:tidyverse风格实现
library(tidyverse) my_sociomatrix <- trap_df %>% # 过滤无效记录+标记出现状态 filter(!is.na(individual)) %>% mutate(val = 1) %>% # 转宽格式:行=个体,列=诱捕事件,缺失值填0 pivot_wider(names_from = `trap event`, values_from = val, values_fill = 0) %>% column_to_rownames("individual") %>% as.matrix() %>% # 矩阵相乘得到共现矩阵 `%*%`(t(.)) diag(my_sociomatrix) <- 0
结果验证
你可以用给出的示例数据测试:运行后my_sociomatrix["NA002", "NA03,41"]返回值为2,my_sociomatrix["NA002", "NA03,42"]返回值为0,和你预期的效果完全一致。
内容的提问来源于stack exchange,提问作者R James
相关产品推荐
相关产品推荐

