【问题标题】:How to remove data after certain characters如何在某些字符后删除数据
【发布时间】:2021-12-28 13:47:21
【问题描述】:

我需要知道如何从第一个 D 字母和第一个数字或第二个数字后的值中删除所有字符。我不知道如何开始。

我有一个数据框和一个字符类型的列

  • 该列名为“Eircode”

邮政编码从 D01 到 D24(这些是都柏林邮政编码)

值是这样输入的 What you see in red is what needs to be removed.

我需要能够删除最后一位数字之后的字符。

我的数据框被称为“MainSchools”

因此,如果“Eircode”是D03P820,我需要在更改后将其设为D03

如果可能的话,我希望能够使用Tidyverse 包来做到这一点。

【问题讨论】:

标签: r tidyverse


【解决方案1】:

您可以在这里使用sub

df <- data.frame(Eircode=c("D15P820", "K78YD27", "D03P820"),
                 stringsAsFactors=FALSE)
df$Eircode <- sub("^(D(?:0[1-9]|1[0-9]|2[0-4])).*$", "\\1", df$Eircode)
df

  Eircode
1     D15
2 K78YD27
3     D03

上面使用的正则表达式模式匹配并捕获都柏林邮政编码,如下所示:

D           match D
(?:
    0[1-9]  followed by 0-9
    |       OR
    1[0-9]  10-19
    |       OR
    2[0-4]  20-24
)

然后,我们使用\1 作为sub 中的替换,只留下3 个字符的都柏林邮政编码。

【讨论】:

  • 我尝试了上面的代码,它的工作方式与预期完全一样。谢谢你 。我也有像 D6WHP92 这样没有 D06 格式的值。我怎样才能调整上述内容以适应这一要求?
  • 可能使用:^(D(?:[0-9]|0[1-9]|1[0-9]|2[0-4])).*$ ... 假设您确实想要定位值D6WHP92
  • 对于诸如 A94FC44K32VK33 之类的值,基本上任何不是 D(加上数字)我知道我可以手动将它们子化,但是我可以使用什么快速函数来简单地删除任何值不是我的 D01 / D1 格式?
  • 将上述正则表达式模式与grepl 结合使用。此时您应该提出一个新问题。
  • MainSchools$Eircode &lt;- sub("^(K).*$", "", MainSchools$Eircode) 刚刚这样做,因为我打算用其他东西代替空字段。感谢以上帮助。
【解决方案2】:

我喜欢使用 stringr 包进行此类操作。

library(dplyr)
library(sitrngr)

df %>% mutate(Eircode = str_extract_all(Eircode, '^[A-Z][0-9]{2}'))

输出来自@Tim Biegeleisen 的数据:

  Eircode
1     D15
2     K78
3     D03

【讨论】:

  • 这也是一个很好的解决方案!谢谢
  • 我很高兴它有效。每当您获得投票特权时,请考虑投票
猜你喜欢
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 2022-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多