我正在清理包含各种奇怪命名约定的表。我一直看到的一个名字是一串日期。其中一些名称包含的数字可以,但我想从字符串中删除日期格式。
编辑 - 日期为mm / YY或mm / YYYY格式。正如我所见,这些日期通常是从2017年开始(我们想要更新的更新)。
例如:
names <- c('IT Company 09/18', 'Tech Company 9/17', '9/2018 XYZ Company', '50/50 Phone Company')
应该是:
c('IT Company', 'Tech Company', 'XYZ Company', '50/50 Phone Company')
我试图在这里使用此函数来标记字符串&#34; /&#34;和日期,但它也提取不是日期的数字:
names2 <- names[grepl("[[:digit:]]", names) & grepl("/", names)]
输出
> names2
[1] "IT Company 09/18"
[2] "Tech Company 9/17"
[3] "9/2018 XYZ Company"
[4] "50/50 Phone Company"
是否有一个特定的日期表达式代替[[:digit:]]来查找带日期的字符串?
另外,删除日期的功能是什么,包括字符串中的斜杠?
答案 0 :(得分:3)
听起来像是stringr
套餐的工作&#39; string_remove_all
功能。
诀窍是让正则表达式模式正确。事实上,您没有标准的日期格式,并且您希望保留50/50,这会使您的生活变得艰难。
这对我有用:
library('stringr')
date.pattern <- ' ?(0|1)?[1-9]/([0-9]{4}|[0-9]{2}) ?'
names <- c('IT Company 09/18', 'Tech Company 9/17', '9/2018 XYZ Company', '50/50 Phone Company')
str_remove_all(names, date.pattern)
该正则表达式应该说
&#34;日期是一个数字,或两个数字,其中第一个数字是0或1.(假设第一个数字总是一个月,单个数字月份可能有一个前导零)。
然后它(懒惰地)允许长度为2或4的年份。如果你有一个你期望遇到的年份的感觉,这可以更精确。 &#34; 0001&#34;您的数据集可能不是一年。
最后,它还会删除前导空格或尾随空格(如果它们存在),因为看起来日期可以在您关注的部分之前和之后,并且从您关注的部分进行空格分隔。
输出
[1] "IT Company" "Tech Company" "XYZ Company"
[4] "50/50 Phone Company"
通过str_extract_all
运行此操作可能很明智,并检查输出以查看它们是否都具有日期外观。
答案 1 :(得分:1)
我相信以下内容会做你想要的。它使用正则表达式后跟trimws
来修剪结果开头和结尾的空格。
trimws(gsub("[[:digit:]]{1,4}/[[:digit:]]{1,4}", "", names))
#[1] "IT Company" "Tech Company" "XYZ Company" "Phone Company"
答案 2 :(得分:1)
这是一个stringr
解决方案。这很复杂,因为很难通过查看来确定某个日期是否是日期:如果有更多情况,您需要检查输出并调整此代码。第一个正则表达式捕获的格式是1/2位数,/
,0
或1
,还有一个数字,假设任何日期都是2000年后。第二行删除数字,/
,然后是四位数。这很好地排除了50/50
,但如果它被称为12/50 Phone Company
怎么办?这可以解释为1950年12月的特定日期格式。您必须确保不会意外地排除任何类似的特殊情况,并且没有通用的方法来判断某些事情是否属于约会。
我会阅读正则表达式;这是一个good resource开始。
library(stringr)
names <- c('IT Company 09/18', 'Tech Company 9/17', '9/2018 XYZ Company', '50/50 Phone Company')
names %>%
str_replace("\\d{1,2}/(0|1)\\d", "") %>%
str_replace("\\d/\\d{4}", "") %>%
str_trim()
#> [1] "IT Company" "Tech Company" "XYZ Company"
#> [4] "50/50 Phone Company"
由reprex package(v0.2.0)创建于2018-03-14。