如何在R中将汇总得分列转换为二元响应列?
解决方法
可以通过先转长格式再拆分的方式实现需求,结合tidyr::pivot_longer()和tidyr::uncount()就能解决uncount仅支持单列权重的问题,具体步骤如下:
1. 构造示例数据
先模拟符合你描述的比赛结果数据框(方便测试验证):
library(tidyverse) game_results <- tibble( event.date = as.Date("2024-06-15"), home.name = "A", away.name = "B", home.score = 7, away.score = 5 # 总得分12,最终会生成12行逐点记录 )
2. 转换为逐点记录格式
通过三步完成转换:转长格式拆分得分列、按分数值拆分行、生成二元响应列:
point_records <- game_results %>% # 将home.score和away.score转为长格式,区分得分归属和分数值 pivot_longer( cols = c(home.score, away.score), names_to = "score_owner", values_to = "point_count" ) %>% # 按point_count的值,把每行拆分成对应数量的行 uncount(point_count) %>% # 生成二元响应列:home得分则home.score=1、away.score=0,反之亦然 mutate( home.score = if_else(score_owner == "home.score", 1, 0), away.score = if_else(score_owner == "away.score", 1, 0), score_owner = NULL # 可选:删除中间辅助列 )
3. 结果说明
运行后point_records会生成12行数据:其中7行对应A(主队)的得分(home.score=1、away.score=0),5行对应B(客队)的得分(home.score=0、away.score=1),完全匹配你的需求。如果原始数据包含多场比赛,该代码可以直接批量处理,无需额外修改。
内容的提问来源于stack exchange,提问作者Trevor Greissinger
相关产品推荐
相关产品推荐

