如何将单列DataFrame拆分为主客队得分与球队四列?
R语言拆分单列比赛数据为得分和队名列
现有如下单列DataFrame,每行记录了一场比赛的客队得分、客队名称、主队得分、主队名称(部分队名包含空格):
scores <- data.frame(V1 = c("52 Gering 38 Alliance", "60 Wahoo 43 Bennington", "58 Gothenburg 43 Lexington", "73 Plattview 62 Elkhorn North"))
下面提供几种实用的拆分方法:
方法1:用tidyr包的extract函数(推荐)
tidyr的extract()可以直接按正则表达式的分组拆分列,完美适配这种有固定结构的文本:
library(tidyr) # 正则分组逻辑: # (\\d+) 匹配客队得分(纯数字) # (.*?) 非贪婪匹配客队名称(截取下一个数字前的所有内容) # (\\d+) 匹配主队得分(纯数字) # (.*) 匹配剩余的主队名称(哪怕队名带空格也能完整提取) scores_split <- extract(scores, V1, into = c("Away Score", "Away Team", "Home Score", "Home Team"), regex = "(\\d+) (.*?) (\\d+) (.*)", convert = TRUE) # 自动把得分列转为数值型,方便后续计算 print(scores_split)
方法2:用stringr+dplyr组合实现
如果习惯用stringr处理字符串、dplyr做数据清洗,可以这么写:
library(stringr) library(dplyr) scores_split <- scores %>% mutate( # 用str_match提取正则分组,返回矩阵格式 match_data = str_match(V1, "(\\d+) (.*?) (\\d+) (.*)"), `Away Score` = as.numeric(match_data[,2]), `Away Team` = match_data[,3], `Home Score` = as.numeric(match_data[,4]), `Home Team` = match_data[,5] ) %>% select(-V1, -match_data) # 移除原列和中间临时列 print(scores_split)
方法3:Base R原生实现(无需额外包)
要是不想加载第三方包,用Base R的正则拆分也能搞定:
# 用正向断言匹配数字和非数字之间的空格,避免拆分队名里的空格 split_list <- strsplit(scores$V1, "(?<=\\d) (?=\\D)|(?<=\\D) (?=\\d)", perl = TRUE) # 把拆分后的列表转成DataFrame,设置列名 scores_split <- as.data.frame(do.call(rbind, split_list), stringsAsFactors = FALSE) colnames(scores_split) <- c("Away Score", "Away Team", "Home Score", "Home Team") # 将得分列转为数值型 scores_split[,c(1,3)] <- lapply(scores_split[,c(1,3)], as.numeric) print(scores_split)
内容的提问来源于stack exchange,提问作者Jeff Swanson
相关产品推荐
相关产品推荐

