如何用for循环在R中按指定维度填充计数与求和矩阵?
基于DataFrame生成指定维度的计数与求和矩阵
数据准备
已创建DataFrame df:
df <- data.frame( names1 = c('mouse','dog','cat','cat','mouse','cat','cat','dog','cat','mouse'), names2 = c('cat','dog','dog','mouse','cat','cat','mouse','mouse','mouse','mouse'), values = c(11,5,41,25,101,78,12,41,6,77) )
定义维度名称向量:
dims <- c('dog','mouse','bird','cat')
初始化零矩阵(行/列名与dims一致):
my_matrix <- matrix(data=0, nrow = length(dims), ncol = length(dims)) rownames(my_matrix) <- dims colnames(my_matrix) <- dims
初始矩阵结构:
dog mouse bird cat dog 0 0 0 0 mouse 0 0 0 0 bird 0 0 0 0 cat 0 0 0 0
目标需求
需生成两个矩阵:
- 计数矩阵:统计
df中names1(行)与names2(列)配对的出现次数,预期结果:
dog mouse bird cat dog 1 1 0 0 mouse 0 1 0 2 bird 0 0 0 0 cat 1 3 0 1
- 求和矩阵:对
df中names1与names2配对对应的values求和,预期结果:
dog mouse bird cat dog 5 41 0 0 mouse 0 77 0 112 bird 0 0 0 0 cat 0 137 0 25
限制条件
- 矩阵的行、列顺序必须严格与
dims向量一致,保留bird维度以体现原数据中无该类数据的情况。
我的尝试
曾用嵌套循环赋值,但条件逻辑错误,得到不符合预期的结果:
for(i in 1:nrow(my_matrix)){ for(j in 1:ncol(my_matrix)){ my_matrix[i,j] <- sum(df$values & df$names1[i] == df$names2[j] & df$names1[j] == df$names2[i]) } }
错误结果:
dog mouse bird cat dog 0 0 0 10 mouse 0 10 0 0 bird 0 0 0 0 cat 10 0 0 0
希望修正循环逻辑,或提供其他符合要求的高效解决方案。
解决方案
方法1:修正嵌套循环
核心错误是混淆了矩阵索引与df中的值,应通过矩阵的行/列名匹配df中的names1/names2:
生成计数矩阵
count_matrix <- my_matrix # 复制初始零矩阵 for(i in 1:nrow(count_matrix)){ row_name <- rownames(count_matrix)[i] for(j in 1:ncol(count_matrix)){ col_name <- colnames(count_matrix)[j] # 统计df中names1=行名且names2=列名的行数 count_matrix[i,j] <- sum(df$names1 == row_name & df$names2 == col_name) } } count_matrix
生成求和矩阵
sum_matrix <- my_matrix for(i in 1:nrow(sum_matrix)){ row_name <- rownames(sum_matrix)[i] for(j in 1:ncol(sum_matrix)){ col_name <- colnames(sum_matrix)[j] # 对符合条件的values求和 sum_matrix[i,j] <- sum(df$values[df$names1 == row_name & df$names2 == col_name]) } } sum_matrix
方法2:使用R内置函数(高效无循环)
利用table和xtabs快速生成矩阵,再调整维度顺序:
计数矩阵
# 先生成基础计数表 count_table <- table(df$names1, df$names2) # 按dims顺序重新排序行和列,补充缺失的bird维度 count_matrix <- as.matrix(count_table)[dims, dims] # 替换NA为0(因为bird在原数据中无匹配) count_matrix[is.na(count_matrix)] <- 0 count_matrix
求和矩阵
# 生成基础求和表 sum_table <- xtabs(values ~ names1 + names2, df) # 按dims顺序调整维度,补充bird sum_matrix <- as.matrix(sum_table)[dims, dims] sum_matrix[is.na(sum_matrix)] <- 0 sum_matrix
内容的提问来源于stack exchange,提问作者Lakis
相关产品推荐
相关产品推荐

