【发布时间】:2020-04-08 19:35:41
【问题描述】:
我正在尝试清理数据并将其更改为特定格式。
所有数据应具有以下格式:2 位数字、3 个字母 (MKT)、4 位数字、1 个下划线和 1 位数字(例如 66MKT1234_1)
假设我有以下数据:
V <- c("66MKT030_2", "66MGT1220_2", "66MGT063_1", "66MKT350_2","22233366698","66MKT3500_2", "9999999")
要更正的内容: a) 向量的第 1、第 3 和第 4 个元素在 3 个字母 (MTG) 之后只有 3 个数字。在这种情况下,我需要在最后一个字母后添加一个 0 数字 b) 第 2 和第 3 个元素需要从“MGT”到“MTG”正确 c) 需要删除第 5 和第 7 个元素。
我的方法是:
第 1 步 - 删除与格式不匹配的数据(2 个数字,3 个字母 (MKT),4 个数字,1 个下划线和 1 个数字)
aa <- grepl("\\d{2}\\w{3}\\d{3,4}[:punct:]\\d{1}", V)
V2 <- V[aa]
第 2 步 - 使用 gsub 将“MGT”更正为“MTG”
第 3 步 - 如果数字长度为 3,则想办法在字母后添加数字 0(例如,第一个元素应从 66MKT030_2 更改为 66MKT0030_2)
我被困在第 1 步,因为我的代码无法从向量中清除第 5 个(“22233366698”)和第 7 个(“9999999”)元素。
你能帮我看看如何以一种更好的方式做到这一点吗?
谢谢
【问题讨论】:
-
这听起来你可能有一个相当大的清理工作。您可能只想将问题集中在您描述的步骤之一上。
-
试试
sub("^(\\d{2}[[:alpha:]]{3})(\\d{3}\\D)", "\\10\\2", sub("MGT", "MTG", grep("^\\d+$", V, value=TRUE, invert=TRUE), fixed=TRUE)) -
谢谢维克托。它似乎工作。你能解释一下 "\\10\\2" & grep("^\\d+$", V, value=TRUE, invert=TRUE 是做什么的吗?