R语言技术需求:将单列橄榄球队胜负数据拆分为胜负两列
解决方案:拆分橄榄球队胜负数据为两列
嘿,我来帮你搞定这个数据拆分的问题!你的数据集里每个赛季的每支球队都有两行记录,分别对应胜场和负场的数值,我们可以用几种不同的R语言方法把它们合并成一行,拆分成Wins和Losses两列,下面是具体实现:
方法1:用tidyr的pivot_wider(推荐,直观清晰)
这个方法先给每组数据标记胜负类型,再转换为宽格式,非常适合处理这类长转宽的问题:
# 加载tidyverse包(包含tidyr和dplyr) library(tidyverse) # 你的示例数据 Football <- data.frame ( Season = rep ("2009", 10), Team = rep (c("ARI", "ARI", "ATL", "ATL", "BAL", "BAL", "BUF", "BUF", "CAR", "CAR")), Value = c(10, 6, 7, 9, 7, 9, 6, 10, 8, 8) ) # 给每个球队的两行数据标记"Wins"和"Losses" Football <- Football %>% group_by(Season, Team) %>% mutate(Result = c("Wins", "Losses")) %>% ungroup() # 转换为宽格式,得到目标结构 Football_wide <- Football %>% pivot_wider(names_from = Result, values_from = Value) # 查看结果 print(Football_wide)
运行后你会得到这样的输出:
# A tibble: 5 × 4 Season Team Wins Losses <chr> <chr> <dbl> <dbl> 1 2009 ARI 10 6 2 2009 ATL 7 9 3 2009 BAL 7 9 4 2009 BUF 6 10 5 2009 CAR 8 8
方法2:用dplyr的summarize(更简洁)
如果你确定每个球队的第一行是胜场、第二行是负场,可以直接提取每组的首尾值:
library(dplyr) Football_wide <- Football %>% group_by(Season, Team) %>% summarize( Wins = first(Value), Losses = last(Value), .groups = "drop" # 取消分组 ) print(Football_wide)
这个方法不需要额外标记列,代码更短,结果和上面完全一致。
方法3:Base R实现(无需额外包)
如果不想加载第三方包,用Base R也能完成:
# 按赛季和球队分组拆分Value列 value_groups <- split(Football$Value, list(Football$Season, Football$Team)) # 构造目标数据框 Football_wide <- data.frame( Season = sapply(strsplit(names(value_groups), "\\."), `[`, 1), Team = sapply(strsplit(names(value_groups), "\\."), `[`, 2), Wins = sapply(value_groups, `[`, 1), Losses = sapply(value_groups, `[`, 2) ) print(Football_wide)
这里用split()分组,再从分组名称中提取赛季和球队信息,最后提取每组的两个值作为胜场和负场。
内容的提问来源于stack exchange,提问作者JJGabe
相关产品推荐
相关产品推荐

