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

R digit-expression and unlist doesn't work

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

我有一个 table,其日期列由数字组成,类似于“2001-”。根据教程,下面的行将通过挑出前四位数字来从日期中删除“-”:

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

当我运行这个命令时,"yend_clean"只是设置为"character (empty)"。

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

所以我怀疑“4$”周围的东西是问题所在。我找不到任何相关文档来帮助我找到正确的解决方案。

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

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

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

或等同于

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

如果你真的想要删除“-”

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

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

match any single digit, followed by a 4, followed by the end of the string

当您删除“4”时,模式变为 "match any single digit",这正是所发生的事情(即您分别匹配每个数字)。

我建议的模式改为:

match the beginning of the string (^), followed by a digit repeated four times.

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

如果您指的是 Automated Data Collection with 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”。第一行,表示四位数字和一个破折号,结尾,return“2010-”,第二行return“2010”.