You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

目标需求

需生成两个矩阵:

  1. 计数矩阵:统计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
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 05:50:27