基于交互频次将DataFrame转换为矩阵的问题求助
解决方法
你的问题出在table()函数的输入上——你没有用原始数据中的GIVER和RECIPIENT列来统计交互频次,反而用了所有个体的笛卡尔积列表,自然无法得到真实的交互次数。
以下是修正后的函数,同时保留你需要的「包含所有个体」的矩阵要求:
my_matrix = function(df){ # 获取所有唯一的个体,排序后作为行/列名 all_individuals <- sort(unique(c(df$GIVER, df$RECIPIENT))) # 统计原始数据中 giver -> recipient 的实际交互频次 interaction_counts <- table(df$GIVER, df$RECIPIENT) # 创建全0矩阵,维度匹配所有个体 matrixi <- matrix(0, nrow = length(all_individuals), ncol = length(all_individuals), dimnames = list(all_individuals, all_individuals)) # 将统计到的频次填充到矩阵对应位置 matrixi[rownames(interaction_counts), colnames(interaction_counts)] <- interaction_counts # 转换为数据框返回 as.data.frame(matrixi) }
代码解释
- 获取所有个体:用
c(df$GIVER, df$RECIPIENT)合并两列后去重排序,确保矩阵包含所有出现过的个体。 - 统计真实交互频次:直接对原始的
GIVER和RECIPIENT列做table(),得到的是实际的 giver→recipient 交互次数。 - 填充矩阵:把统计到的频次对应填入全0矩阵的位置,未出现的交互对保持0值。
用你提供的示例数据测试,会得到正确的结果:
A B C D E A 0 1 1 0 0 B 0 0 0 1 0 C 0 0 0 0 1 D 1 0 0 0 0 E 0 1 0 0 0
内容的提问来源于stack exchange,提问作者Vittoria Roatti
相关产品推荐
相关产品推荐

