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

如何将单列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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 12:09:55