如何无需指定字面字符串值对DataFrame按Team与Points规则分组?
解决方案
假设你的DataFrame包含赛事标识字段(比如Start+Book,用于区分不同赛事),可以通过以下程序化的dplyr步骤实现需求:
步骤说明
核心逻辑是:在同一赛事范围内,通过Points的绝对值匹配互为相反数的记录,再确保每组对应两个不同Team。
代码实现
首先构造示例数据(可替换为你的真实数据):
library(dplyr) # 示例DataFrame df <- tibble( ID = 1:6, Start = c("2023-10-01", "2023-10-01", "2023-10-02", "2023-10-02", "2023-10-03", "2023-10-03"), Book = c("A", "A", "B", "B", "C", "C"), Team = c("X", "Y", "Z", "W", "X", "Z"), Points = c(3, -3, 5, -5, 2, -2) )
执行分组逻辑:
grouped_df <- df %>% # 按赛事维度分组(根据你的数据调整,确保同一赛事的Team在此组内) group_by(Start, Book) %>% # 用Points绝对值生成配对键,互为相反数的Points会共享同一键 mutate(pair_key = abs(Points)) %>% # 按配对键二次分组,锁定同一赛事下的Points配对组 group_by(Start, Book, pair_key, .add = TRUE) %>% # 过滤掉组内Team数量不为2的无效记录(排除单个Team的异常数据) filter(n_distinct(Team) == 2) %>% # 生成最终分组ID,方便后续操作 mutate(group_id = paste(Start, Book, pair_key, sep = "_")) %>% ungroup()
结果验证
处理后每个group_id对应的记录满足:
- 属于同一赛事(
Start+Book相同) - 包含两个不同的
Team Points值互为相反数
如果你的赛事标识字段不是Start+Book,仅需修改第一个group_by的参数即可,全程无需手动指定Team的具体值,适配任意规模的赛事数据。
内容的提问来源于stack exchange,提问作者Aaron Morris
相关产品推荐
相关产品推荐

