R语言高效统计两两个体同组共现次数的实现方法
R语言个体同组共现次数高效统计方案
针对169个体、千行级观测数据的场景,以下方案计算效率足够,可直接输出你需要的三种格式结果,同时规避之前生成空矩阵的问题。
前置处理
你提供的样例数据自带grouped_df分组属性,未解除分组直接做聚合操作大概率是之前结果为空的核心原因,第一步先做数据解组:
library(dplyr) library(tidyr) library(purrr) # 解除原数据默认分组,避免后续操作受分组规则干扰 df <- your_data %>% ungroup()
核心计数逻辑
- 按组号
Gp.nr分组,提取每组内去重后的个体ID(同组内重复出现的同个个体仅计数1次,避免虚高) - 对每组个体列表生成无序两两配对(统一排序后拼接ID,保证
Aa-Bd和Bd-Aa识别为同一个配对) - 累计所有组的配对出现次数
cooccur_res <- df %>% group_by(Gp.nr) %>% summarise(indiv_set = list(unique(as.character(IDIndividual1))), .groups = "drop") %>% mutate( dyad = map(indiv_set, ~{ # 组内不足2个个体时无共现关系,直接跳过 if(length(.x) < 2) return(NULL) combn(.x, 2, simplify = FALSE) %>% map_chr(~paste(sort(.x), collapse = "-")) }) ) %>% unnest(dyad) %>% count(dyad, name = "Occurrence")
其他常见结果异常原因:未将因子类型的ID转为字符、未对配对ID做排序导致同个配对生成两个名称、未对同组内重复ID去重。
三种目标格式输出
1. 长表格式
核心计数结果直接重命名即为标准长表,也可按共现次数合并同次数的个体对:
# 基础长表:含Dyad(个体对)、Occurrence(共现次数)两个字段 long_format <- cooccur_res %>% rename(Dyad = dyad) # 按共现次数合并个体对 long_merged <- long_format %>% group_by(Occurrence) %>% summarise(Dyad = list(Dyad), .groups = "drop")
2. 共现矩阵格式
行列均为个体ID,单元格值为两两个体同组共现次数:
# 获取数据集中所有出现过的个体全集 all_id <- unique(as.character(df$IDIndividual1)) # 初始化全0矩阵 cooccur_matrix <- matrix( 0, nrow = length(all_id), ncol = length(all_id), dimnames = list(all_id, all_id) ) # 拆分个体对填充矩阵 fill_data <- cooccur_res %>% separate(dyad, into = c("id1", "id2"), sep = "-") cooccur_matrix[as.matrix(fill_data[, c("id1", "id2")])] <- fill_data$Occurrence cooccur_matrix[as.matrix(fill_data[, c("id2", "id1")])] <- fill_data$Occurrence # 对角线值可按需调整,这里默认设为NA(个体自身无共现意义) diag(cooccur_matrix) <- NA
3. 宽表格式
每个两两个体对为单独列,单元格值为对应共现次数:
wide_format <- cooccur_res %>% pivot_wider(names_from = dyad, values_from = Occurrence, values_fill = 0)
效率说明
169个个体最多生成14196个无序配对,千行级观测数据下整个计算过程耗时在毫秒级,无性能瓶颈。
内容的提问来源于stack exchange,提问作者Josefien
相关产品推荐
相关产品推荐

