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

如何用tidy方法在R中比较多键列匹配的行生成新分类变量

用Tidy方法实现对局数据的目标变量分类

原始数据

我有如下记录两人游戏对局情况的数据框df:

df <- read.table(header = TRUE, text = "
id pair game round win target_var
1.   1.   1.    1.  0.         1.
1.   1.   1.    2.  1.         1.
1.   1.   2.    1.  1.         1.
1.   1.   2.    2.  0.         0.
2.   1.   1.    1.  1.         0.
2.   1.   1.    2.  0.         0.
2.   1.   2.    1.  0.         1.
2.   1.   2.    2.  1.         0.
")

需求说明

需要按pair、game、round分组(每组对应一局两个玩家的对局),对比组内不同id的两行数据,结合target_var(二进制变量)和win(1代表胜者),判断以下四种target_var的情况,生成新列desire:

  • 双方target_var均为真 → 标记为'b'
  • 双方target_var均不为真 → 标记为'n'
  • 仅胜者的target_var为真 → 标记为'w'
  • 仅败者的target_var为真 → 标记为'l'

预期输出

最终需要得到如下结果:

df_outcome <- read.table(header = TRUE, text = "
id pair game round win target_var desire
1.   1.   1.    1.  0.         1.    'l'
1.   1.   1.    2.  1.         1.    'w'
1.   1.   2.    1.  1.         1.    'b'
1.   1.   2.    2.  0.         0.    'n'
2.   1.   1.    1.  1.         0.    'l'
2.   1.   1.   2.    0.         0.    'w'
2.   1.   2.    1.  0.         1.    'b'
2.   1.   2.    2.  1.         0.    'n'
")

Tidy解决方案

使用dplyr包的分组和条件判断功能,实现高效简洁的处理:

library(dplyr)

# 清理数据类型并处理
df_processed <- df %>%
  # 将所有带.的列转换为数值类型
  mutate(across(everything(), ~as.numeric(gsub("\\.", "", .x)))) %>%
  # 按对局唯一标识分组
  group_by(pair, game, round) %>%
  mutate(
    # 获取同组内另一个玩家的target_var和win值
    opp_target = target_var[id != first(id)],
    opp_win = win[id != first(id)],
    # 根据条件匹配desire标记
    desire = case_when(
      target_var == 1 & opp_target == 1 ~ 'b',
      target_var == 0 & opp_target == 0 ~ 'n',
      win == 1 & target_var == 1 & opp_target == 0 ~ 'w',
      win == 0 & target_var == 1 & opp_target == 0 ~ 'l'
    )
  ) %>%
  # 取消分组并移除中间变量
  ungroup() %>%
  select(-opp_target, -opp_win)

# 查看结果
print(df_processed)

代码说明

  1. 数据类型清理:首先把原始数据中带.的字符串转换为数值,避免后续计算出错;
  2. 分组处理:按pair、game、round分组,确保每组是同一局的两个玩家数据;
  3. 获取对方数据:利用每组只有两个玩家的特性,通过id != first(id)定位另一个玩家的target_var和win值;
  4. 条件判断:用case_when按需求的四种情况逐一匹配,生成desire列;
  5. 清理输出:取消分组并移除中间生成的辅助变量,得到干净的结果。

内容的提问来源于stack exchange,提问作者grace.cutler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:10:54