R导入pgn文件数据框is_empty仅首行非空 无法正常提取行数据
问题原因
你踩了两个非常基础的R读写和索引的坑:
- 读入参数错误:
read.delim()默认参数会把文件第一行识别为列名,且默认按制表符拆分列。你的pgn是纯文本逐行存储的格式,没有制表符分隔的多列结构,直接用默认参数读的话,第一行的[Event Live Chess]会被错误解析成列名,后续行的解析也会出问题,才会出现除了第一列第一行之外其余位置全是空值的情况。 - 取行函数用错:R里的
row()函数作用是返回矩阵/数据框对应位置的行号索引,根本不是用来提取指定行内容的,你传参数4进去返回1-23的行号序列是这个函数的正常输出,和你要的取行需求完全不相关。
修复步骤
1. 重新正确读入pgn文件
两种写法都可以,选一种执行即可:
- 用
read.delim的话,手动关闭表头识别、指定按换行符拆分每行、关闭因子自动转换:
pgn_df <- read.delim( "test.pgn", header = FALSE, sep = "\n", stringsAsFactors = FALSE, col.names = "line_content" )
- 更简单的写法是直接按行读入文本再转数据框,适合这种无固定列分隔的纯文本文件:
raw_lines <- readLines("test.pgn") pgn_df <- data.frame( line_content = raw_lines, stringsAsFactors = FALSE )
读入完成后再调用View(pgn_df),就能看到所有23行内容都规整存在line_content列下,不会再出现第一行被吞了当列名的问题。
2. 用正确的索引语法提取目标行
R里提取数据框行/列直接用[行号,列名/列号]的基础索引语法就行,不需要调用别的函数。
比如你要取第4行的白方棋手信息,直接运行:
white_player <- pgn_df[4, "line_content"]
运行后white_player就会存储[White dervogel09]这行的完整内容,后续提取黑方信息、Elo分、走法记录都按这个索引规则取对应行号即可。
验证
读入正确后再做空值检测:
# 检测第4行内容是否为空,会返回FALSE is_empty(pgn_df[4, "line_content"])
不会再出现其余行全识别为空的问题。
内容的提问来源于stack exchange,提问作者supercarp
相关产品推荐
相关产品推荐

