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

如何基于球队列合并得分列?R语言数据重塑求助

解决方案

要实现你想要的数据重塑,关键是同时将team和score的成对列转换为长格式,让每个队伍与其对应的得分正确匹配,再按需筛选结果。

步骤1:使用带正则匹配的pivot_longer

利用names_pattern参数拆分列名中的前缀(team/score)和后缀(one/two),将对应的队伍和得分自动配对:

library(tidyr)
library(dplyr)

# 加载数据
data <- tribble(~team_one, ~team_two, ~score_one, ~score_two,
                "Australia", "New Zealand", 214, 170,
                "Australia", "New Zealand", 214, 170,
                "New Zealand", "Australia", 214, 170,
                "New Zealand", "Australia", 214, 170)

# 数据重塑
result <- data |>
  pivot_longer(
    cols = everything(),  # 选择所有列进行转换
    names_to = c(".value", "id"),  # .value表示保留前缀作为列名,id存储后缀(one/two)
    names_pattern = "(team|score)_(one|two)"  # 正则匹配拆分列名
  ) |>
  # 筛选出目标的队伍-得分组合
  filter((team == "Australia" & score == 214) | (team == "New Zealand" & score == 170)) |>
  select(team, score)  # 只保留需要的列

print(result)

输出结果

# A tibble: 4 × 2
  team          score
  <chr>         <dbl>
1 Australia       214
2 New Zealand     170
3 Australia       214
4 New Zealand     170

关键解释

  • names_pattern = "(team|score)_(one|two)":将列名拆分为两部分,第一部分(team或score)作为新的列名(由.value指定),第二部分(one或two)作为分组标识id,这样team_one和score_one会自动配对,team_two和score_two也会自动配对。
  • 筛选步骤是为了排除原数据中反向比赛(新西兰作为主队得214分)的记录,如果你需要保留所有队伍的得分,只需去掉filter语句即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:25:27