如何基于球队列合并得分列?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
相关产品推荐
相关产品推荐

