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

R导入pgn文件数据框is_empty仅首行非空 无法正常提取行数据

问题原因

你踩了两个非常基础的R读写和索引的坑:

  1. 读入参数错误:read.delim()默认参数会把文件第一行识别为列名,且默认按制表符拆分列。你的pgn是纯文本逐行存储的格式,没有制表符分隔的多列结构,直接用默认参数读的话,第一行的[Event Live Chess]会被错误解析成列名,后续行的解析也会出问题,才会出现除了第一列第一行之外其余位置全是空值的情况。
  2. 取行函数用错: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:48:39