如何从NBA赛事日志的比赛描述中提取英尺单位的投篮距离
R语言提取NBA赛事日志中投篮距离的解决方案
问题原因
你之前使用parse_number得到错误结果的核心原因是:该函数会默认提取字符串中第一个出现的数值,第二行主场描述Holiday BLOCK (1 BLK)里的封盖计数1会被优先提取,因此输出错误结果c(20,1)。
解决方案
投篮距离在赛事日志中有独有格式特征:数字后紧跟单引号',其他计数类数值(封盖次数、犯规次数等)均不会带有该后缀,我们可以基于该特征用正则表达式做精准提取。
1. 构造示例数据
library(tidyverse) # 示例数据 df <- tibble( HomePlayDescription = c("MISS Davis 20' Jump Shot", "Holiday BLOCK (1 BLK)"), AwayPlayDescription = c(NA, "MISS Payton 2' Layup") )
2. tidyverse 实现方案
shot_dist <- df %>% # 合并两列描述数据,自动过滤空值 pivot_longer(everything(), values_drop_na = TRUE) %>% # 匹配所有后缀带单引号的数字 mutate(dist = str_extract(value, "\\d+(?=')")) %>% # 过滤无投篮距离的非投篮事件行 filter(!is.na(dist)) %>% pull(dist) %>% as.numeric()
运行后输出shot_dist结果为20 2,符合预期。
3. base R 实现方案
如果你不想加载额外包,也可以用base R原生函数实现:
# 合并两列并去除空值 all_text <- na.omit(c(df$HomePlayDescription, df$AwayPlayDescription)) # 正则匹配带单引号的数字 dist_pattern <- gregexpr("\\d+(?=')", all_text, perl = TRUE) shot_dist <- as.numeric(unlist(regmatches(all_text, dist_pattern)))
内容的提问来源于stack exchange,提问作者tedescr
相关产品推荐
相关产品推荐

