R语言基于矩阵行列名更新对应单元格的实现问题
原代码错误原因
- 循环内的条件判断
dtMatrix$Event == "Good Pass"没有指定行索引i,会对整个Event列做批量判断,逻辑异常 - 矩阵赋值语句逻辑错误:
myMatrix[rownames(myMatrix), colnames(myMatrix)] <- 1 + myMatrix[rownames(myMatrix), colnames(myMatrix)]是对整个矩阵所有元素统一加1,不是仅修改匹配到的单个单元格 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
相关产品推荐
相关产品推荐

