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

The*_*uit 0 regex r digit

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

我有一个日期列的表格,其中包含类似"2001-"的数字.根据教程,下面的行将通过单独输出前四位数字从日期中删除" - ":

yend_clean <- unlist(str_extract_all(danger_table$yend, "[[:digit:]]4$"))
Run Code Online (Sandbox Code Playgroud)

当我运行此命令时,"yend_clean"只是设置为"character(empty)".

如果我删除"4 $",我将所有日期拆分为原子,这样原来看起来像这个"1992","2003"的列表现在看起来像这个"1","9"等.

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

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

Bro*_*ieG 5

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

unlist(str_extract_all("2003-", "^[[:digit:]]{4}"))
Run Code Online (Sandbox Code Playgroud)

或者等价的

sub("^(\\d{4}).*", "\\1", "2003-")
Run Code Online (Sandbox Code Playgroud)

如果真的你想要的只是删除" - "

sub("-", "", "2003-")
Run Code Online (Sandbox Code Playgroud)

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

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

当你删除"4"时,模式变为"匹配任何一个数字",这正是发生的事情(即你得到的每个数字分开匹配).

我建议的模式代替:

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

sub变化是我们建立一个满足我们希望保持在括号,然后一切括号外的(图案的很常见的技术.*匹配任何东西,任何次数).然后我们用parens中的那个部分替换整个匹配(\\1意味着括号中的第一个子表达式).\\d相当于[[:digit:]].