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

