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

如何在R中正确导入2014年NIBRS格式的.txt数据文件

解决2014年NIBRS TXT文件导入R的实操思路

1. 先搞懂NIBRS文件的本质格式

NIBRS(国家基于事件的报告系统)的原始数据文件都是固定宽度格式,不是用制表符、逗号这类分隔符拆分列的——这就是你用read.delim/read_tsv这类分隔符导向函数导入后,列名、数据全乱的核心原因。

2. 用已获取的文件头信息定规则

你已经通过readLines拿到了文件前几行,接下来这么用:

  • 先把内容打印出来,仔细对比列名行和数据行的字符位置:
    # 读取前10行方便分析
    nibrs_head <- readLines("path/to/file.txt", n = 10)
    print(nibrs_head)
    
  • 找2014版NIBRS的官方数据字典,里面会明确每一列的起始/结束字符位置、列名、数据类型(比如第1-5位是AGENCY_ID,第6-13位是INCIDENT_DATE)。
  • 要是找不到官方字典,就手动对比:列名之间的空白对应数据行的固定宽度,比如列名AGENCY结束在第5位,下一个列名DATE从第6位开始,那第一列的宽度就是5。

3. 用read_fwf精准导入

read_fwf是专门处理固定宽度文件的函数,两种常用用法:

方式一:指定列宽

如果已经算出每一列的字符数,直接传widths参数:

library(readr)
# 示例:假设从字典拿到的列宽和列名
nibrs_data <- read_fwf("path/to/file.txt", 
                       widths = c(5, 8, 10, ...), # 对应每列的字符数
                       col_names = c("AGENCY_ID", "INCIDENT_DATE", "OFFENSE_CODE", ...),
                       skip = 0) # 第一行是列名就设0,有说明行就设对应行数

方式二:指定列的起止位置

知道每列的起始和结束字符位,用fwf_positions:

nibrs_data <- read_fwf("path/to/file.txt",
                       col_positions = fwf_positions(start = c(1, 6, 14), 
                                                     end = c(5, 13, 23),
                                                     col_names = c("AGENCY_ID", "INCIDENT_DATE", "OFFENSE_CODE")),
                       skip = 0)

后续调整

  • 导入后部分列可能是字符型,手动转成对应类型:
    library(dplyr)
    nibrs_data <- nibrs_data %>%
      mutate(INCIDENT_DATE = as.Date(INCIDENT_DATE, format = "%Y%m%d"),
             OFFENSE_CODE = as.integer(OFFENSE_CODE))
    
  • 要是有乱码,加编码参数:locale = locale(encoding = "ISO-8859-1")(NIBRS常用编码)

4. 常见坑排查

  • 跳过冗余行:如果文件开头有说明文字,用skip参数跳过(比如skip=3)。
  • 缺失值处理:固定宽度文件的缺失值一般是空格填充,read_fwf会自动识别为NA,无需额外设置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:03:11