R数字表达和取消列表不起作用

时间:2015-05-08 12:32:32

标签: regex r digit

所以我买了一本关于R和自动数据收集的书,其中一个例子让我感到困惑。

我有一个日期列的表格,其中包含看起来像这个“2001-”的数字。根据教程,下面的行将通过挑出前四位数字从日期中删除“ - ”:

yend_clean <- unlist(str_extract_all(danger_table$yend, "[[:digit:]]4$"))

当我运行此命令时,“yend_clean”只是设置为“character(empty)”。

如果我删除“4 $”,我会将所有日期拆分为原子,以便最初看起来像“1992”,“2003”的列表现在看起来像“1”,“9”等。

所以我怀疑“4 $”周围存在的问题。我找不到任何有关这方面的文档,可以帮助我找出正确的解决方案。

希望有人在这里指出我正确的方向。

2 个答案:

答案 0 :(得分:5)

这是一个正则表达式问题。你的正则表达式是错误的。使用:

unlist(str_extract_all("2003-", "^[[:digit:]]{4}"))

或等效

sub("^(\\d{4}).*", "\\1", "2003-")

如果真的想要删除&#34; - &#34;

sub("-", "", "2003-")

正则表达式中的重复由{}参数控制。你错过了。另外$表示匹配字符串的结尾,因此您的表达式转换为:

  

匹配任何一个数字,后跟一个4,然后是字符串的结尾

当你删除&#34; 4&#34;时,模式变为&#34;匹配任何单个数字&#34;,这正是发生的事情(即你得到的每个数字分开匹配)。

我建议的模式反而说:

  

匹配字符串的开头(^),然后重复四次数字。

sub变体是一种非常常见的技术,我们创建一个匹配我们想要保留在括号中的模式,然后括号外的所有其他内容(.*匹配任何内容,任意数量的次)。然后我们用parens中的片段替换整个匹配(\\1表示括号中的第一个子表达式)。 \\d相当于[[:digit:]]

答案 1 :(得分:1)

如果您的意思是使用R 进行自动数据收集,那么代码可能是这样的:

yend_clean <- unlist(str_extract_all(danger_table$yend, "[[:digit:]]{4}[-]$"))
yend_clean <- unlist(str_extract_all(yend_clean, "^[[:digit:]]{4}"))

假设你有一个字符串,“1993-2007,2010-”,你想得到最后一年,即“2010”。第一行,即四位数字,短划线和结束,返回“2010-”,第二行返回“2010”。