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

R语言基于矩阵行列名更新对应单元格的实现问题

原代码错误原因

  1. 循环内的条件判断dtMatrix$Event == "Good Pass"没有指定行索引i,会对整个Event列做批量判断,逻辑异常
  2. 矩阵赋值语句逻辑错误:myMatrix[rownames(myMatrix), colnames(myMatrix)] <- 1 + myMatrix[rownames(myMatrix), colnames(myMatrix)]是对整个矩阵所有元素统一加1,不是仅修改匹配到的单个单元格
  3. which(myMatrix == "P1", arr.ind = T)返回空是因为myMatrix的单元格存储的是数值,行名、列名是矩阵的属性,不是单元格内容,无法通过搜索单元格值匹配行/列名

简便实现方法

不需要写嵌套循环,直接用分组统计+表结构转换即可实现,效率和可读性都更高。

方法1:Base R 实现

dfList <- c("P1", "P2", "P3", "P4", "P5")
# 过滤符合要求的有效传球记录
valid_pass <- dtMatrix[dtMatrix$Event == "Good Pass" & 
                         dtMatrix$category %in% dfList & 
                         dtMatrix$Receiver %in% dfList, 
                       c("category", "Receiver")]
# 统计传球组合频次
pass_table <- table(valid_pass$category, valid_pass$Receiver)
# 转换为对应结构的矩阵,补全所有行/列组合的缺失值
myMatrix <- as.data.frame.matrix(pass_table)
myMatrix <- myMatrix[dfList, dfList]
myMatrix[is.na(myMatrix)] <- 0

方法2:tidyverse 实现(逻辑更直观)

library(dplyr)
library(tidyr)

myMatrix <- dtMatrix %>%
  # 过滤有效传球记录
  filter(Event == "Good Pass",
         category %in% dfList,
         Receiver %in% dfList) %>%
  # 按传球方、接球方分组计数
  count(category, Receiver, name = "times") %>%
  # 转换为宽表,行=传球方、列=接球方、值=传球次数,缺失值默认填0
  pivot_wider(names_from = Receiver, values_from = times, values_fill = 0) %>%
  # 把传球方设为行名
  as.data.frame(row.names = "category") %>%
  # 补全所有球员对应的行和列
  `[`(dfList, dfList)
myMatrix[is.na(myMatrix)] <- 0

两种方法运行后的输出和你给出的expectedOutput完全一致。


内容的提问来源于stack exchange,提问作者samrizz4

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:54:03