所以我买了一本关于R和自动数据收集的书,其中一个例子让我感到困惑。
我有一个日期列的表格,其中包含看起来像这个“2001-”的数字。根据教程,下面的行将通过挑出前四位数字从日期中删除“ - ”:
yend_clean <- unlist(str_extract_all(danger_table$yend, "[[:digit:]]4$"))
当我运行此命令时,“yend_clean”只是设置为“character(empty)”。
如果我删除“4 $”,我会将所有日期拆分为原子,以便最初看起来像“1992”,“2003”的列表现在看起来像“1”,“9”等。
所以我怀疑“4 $”周围存在的问题。我找不到任何有关这方面的文档,可以帮助我找出正确的解决方案。
希望有人在这里指出我正确的方向。
答案 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”。