R语言数据清洗时如何删除包含字符格式日期的行
问题背景
- 清洗仅包含单列的数据集,原始数据示例如下:
# 57 OK ZE für PZR rausgeschraubt # 58 next # 59 K3/ET # 60 15.11.21 Es wurde in der heutigen Dentalhygienesitzung folgende Hilfsmittel verwendet: # 61 UK: # 62 -PSI, SBI, API # 63 -Schall
- 核心需求:删除所有包含
dd.mm.yy格式字符日期的行(例如示例第60行15.11.21 Es wurde in der heutigen...),但不能误删其他含数字的行,数字内容需保留供后续分析使用。 - 此前尝试的两段R代码均未生效,无法正确识别含日期格式的行:
# 第一次尝试代码 behandlungsdoku_clean[is.na(strptime(behandlungsdoku_clean$Aufzeichnungen, format="%d-%m-%Y")),]
# 第二次尝试代码 behandlungsdoku_clean1 <- behandlungsdoku_clean[grep("%d.%m.%Y", behandlungsdoku_clean$Aufzeichnungen, invert= TRUE),]
原有代码失效原因
- 第一段代码存在两个问题:一是指定的日期格式为
%d-%m-%Y(横杠分隔、四位年份),与实际数据中点分隔、两位年份的日期格式不匹配;二是strptime会尝试将整行内容转换为日期类型,而行内除日期外还包含其他文本,所有行都会被转换为NA,导致筛选逻辑完全失效。 - 第二段代码存在两个问题:一是
grep默认将传入的"%d.%m.%Y"作为普通字符串做精确匹配,不会将其识别为日期占位符;二是格式中指定的四位年份%Y与实际数据的两位年份不符,无法匹配到目标行。
可行实现方案
使用正则表达式精准匹配「两位数字+点+两位数字+点+两位数字」的日期格式,反向筛选保留不含该模式的行即可,代码如下:
# 匹配dd.mm.yy格式日期,过滤对应行 behandlungsdoku_clean1 <- behandlungsdoku_clean[ !grepl("\\b\\d{2}\\.\\d{2}\\.\\d{2}\\b", behandlungsdoku_clean$Aufzeichnungen), ]
代码逻辑说明:
grepl逐行检测列内容是否匹配正则规则,返回等长的布尔值向量- 正则规则中
\\d{2}匹配两位数字,\\.转义匹配点号(点在正则中为匹配任意字符的特殊元字符,必须转义),\\b为单词边界,避免误匹配长数字、编码中夹带的类日期片段 - 前加
!对布尔结果取反,最终保留所有不含目标日期格式的行,不会误删其他带普通数字的行。
内容的提问来源于stack exchange,提问作者KC-Migo
相关产品推荐
相关产品推荐

