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
相关产品推荐
相关产品推荐

