【问题标题】:R digit-expression and unlist doesn't workR 数字表达式和 unlist 不起作用
【发布时间】:2015-05-08 12:32:32
【问题描述】:

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

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

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

当我运行这个命令时,“yend_clean”被简单地设置为“字符(空)”。

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

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

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

【问题讨论】:

    标签: regex r digit


    【解决方案1】:

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

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

    或等效

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

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

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

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

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

    当您删除“4”时,模式变为“匹配任何单个数字”,这正是发生的情况(即您分别匹配每个数字)。

    我建议的模式改为:

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

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

    【讨论】:

    • 感谢您的详尽回答!为了使我的语法尽可能接近教程,我发现使用大括号而不是 $ 解决了我的问题。我的代码现在是:yend_clean
    【解决方案2】:

    如果你指的是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”。第一行,表示四位数字和一个破折号,返回“2010-”,第二行返回“2010”。

    【讨论】:

    • 这需要在 2020 年对我进行调整。维基百科页面上的来源略有变化。这是使我能够提取第一年(而不是去年)的代码。 &gt; yend_clean &lt;- str_extract_all(danger_table$yend, "^[[:digit:]]{4}") &gt; danger_table$yend &lt;- as.numeric(yend_clean) &gt; danger_table$yend [1] 2001 1992 2013 2013 2013 2013 2016 2016 2016 2003 1986 2014 2005 2013 2003 2013 1993 2012 1984 2015 2017 2016 2017 2000 2019 1997 2018 2012 1997 2002 [31] 2006 1992 2016 2007 1997 1982 2015 2016 2016 2014 2015 2010 1996 2016 1999 2007 2014 2013 2012 2012 2010 2011 1994
    猜你喜欢
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 2023-04-05
    • 2012-09-08
    相关资源
    最近更新 更多