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

R语言如何将顺序存储的国际象棋走法字符串转为纵向数据框?

R实现国际象棋棋谱数据结构化转换

你可以通过字符串拆分+长表宽表转换的逻辑实现需求,不需要依赖复杂的棋谱解析包,以下是可直接复现的方案:

实现代码

方案使用tidyverse生态的函数处理,逻辑清晰易调整:

# 加载处理包,若未安装可先运行 install.packages("tidyverse")
library(tidyverse)

# 核心转换逻辑
clean_chess_df <- dd %>%
  group_by(game_id) %>%
  # 将整串走法按空格拆分为独立的走法片段
  mutate(single_move = str_split(moves, pattern = " ")) %>%
  unnest(single_move) %>%
  mutate(
    # 识别带数字前缀的白方走法
    is_white = str_detect(single_move, "\\."),
    # 累计生成走法序号
    move_no = cumsum(is_white),
    # 去掉白方走法前的"数字."序号前缀
    move_text = str_remove(single_move, "^[0-9]+\\.")
  ) %>%
  # 标记走法所属方
  mutate(side = ifelse(is_white, "white", "black")) %>%
  # 把同一步的白、黑走法配对到同一行
  pivot_wider(
    id_cols = c(game_id, move_no),
    names_from = side,
    values_from = move_text
  ) %>%
  ungroup()

输出效果

运行后得到的结构化数据完全匹配需求格式,自动适配不同长度的对局:

# A tibble: 13 × 4
   game_id move_no white black
     <dbl>   <int> <chr> <chr>
 1     101       1 e4    c5   
 2     101       2 Nf3   d6   
 3     101       3 d4    cxd4 
 4     101       4 Nxd4  Nf6  
 5     101       5 Nc3   Nc6  
 6     101       6 Bc4   e6   
 7     101       7 Be3   Be7  
 8     102       1 e3    c5   
 9     102       2 Nf3   Nc6  
10     102       3 d4    cxd4 
11     102       4 Nxd4  Nf6  
12     102       5 Nc3   e5   
13     102       6 Ndb5  d6   

注意事项

  • 该逻辑兼容标准国际象棋记谱的所有特殊符号,包括吃子标记x、将军标记+、将杀标记#、王车易位、升变记法等,无需额外调整规则
  • 若出现某对局最后一步只有白方走法(白方走完即终局,无对应黑方走法)的情况,黑方列会自动填充NA,不会出现索引报错
  • 如果需要使用基础R实现,也可以参照同样的拆分-分组-配对逻辑编写,代码量会稍长。

内容的提问来源于stack exchange,提问作者Stacker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:01:07