【问题标题】:Remove the last digits from numbers which exceed a certain length从超过一定长度的数字中删除最后一位数字
【发布时间】:2016-07-13 22:11:35
【问题描述】:

我有一个包含五位和九位数字代码的邮政编码向量。我想从长度超过五的代码中删除结尾数字。

例如以下代码:

zip<-c(11566, 46235, 50467, 856073217, 97333, 856159229)

应该变成

zip
11566
46235
50467
85607
97333
85615

我认为 gsub 将是解决此问题的好方法,但我不知道如何为其编写代码。我试过了,但肯定不行。

df$zip<- gsub("\\d(!i:5)", "", as.character(df$zip))

【问题讨论】:

  • 您将输入转换为字符,这很好 - 我不知道您的真实数据属于哪个类别,但请注意使用 numericinteger 邮政编码数据 - 许多邮政编码开始带有0,如果您转换为数字数据类型,它将被删除。

标签: r gsub maxlength


【解决方案1】:

这应该可以工作

zip<-c(11566, 46235, 50467, 856073217, 97333, 856159229)

> s <- substr(zip,1,5)
> s
[1] "11566" "46235" "50467" "85607" "97333" "85615"

> as.numeric(s)
[1] 11566 46235 50467 85607 97333 85615
> 

【讨论】:

  • 是的,正则表达式对于这个任务来说太过分了。
  • 我会跳过 as.numeric() -- 不在此示例数据中,但一些邮政编码包含前导 0。
【解决方案2】:

我们可以使用sub。将前五个字符捕获为一组 ((.{5})),然后是其余字符。在替换中,我们用反向引用替换。

as.numeric(sub("(.{5}).*", "\\1", zip))
#[1] 11566 46235 50467 85607 97333 85615

需要明确的是,substr 方法会比sub 更快。但是,由于帖子是关于使用 gsub/sub,这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    相关资源
    最近更新 更多