【问题标题】:Separating multiple numbers from a list of numbers and letters in R从R中的数字和字母列表中分离多个数字
【发布时间】:2017-02-28 05:01:34
【问题描述】:

我有一个看起来像这样的列表:

list <- c("2 chairs.", "1 chair & 4 books.", 
         "Sitting on 1 couch. Another 4 chairs & 3 books.", 
         NA, "1 chair.", 
         "3 books")

我的列表实际上有 10k+ 长,但是这个简短的列表包含了所有的变化。我只需要提取椅子之前的数字和书籍之前的数字。我更喜欢最终得到一个列表列表,其中一些列表将包含两个数字,一些列表将包含一个数字,而一些列表将只有 NA。

我尝试了gsub()strsplit() 以各种方式获得我想要的最终结果,但没有运气。

编辑:也许我应该在上面的问题中更具体。我需要结果是数字而不是数字作为字符串。我也希望将 NA 值保持为 NA。谢谢。

【问题讨论】:

  • 对每个字符串的多个匹配项不稳健,但在其他方面可行:sapply(c('chair', 'book'), function(x){as.integer(gsub(paste0('.*(\\d+) ', x, '.*'), '\\1', list))})

标签: r regex text


【解决方案1】:

对于每个字符串的多个匹配项,请尝试:

regmatches(x, gregexpr("\\d+(?= (chair|book))", x, perl=TRUE))
#[[1]]
#[1] "2"
#
#[[2]]
#[1] "1" "4"
#
#[[3]]
#[1] "4" "3"
#
#[[4]]
#character(0)
#
#[[5]]
#[1] "1"

我想str_extract 或表兄弟会做类似的工作。

【讨论】:

  • 我喜欢这个解决方案,这非常接近我的需要。我将问题编辑得更具体一点。我需要输出为数字。提前致谢。
【解决方案2】:

我们可以使用str_extract

str_extract_all(list, "[0-9](?=\\s*(books|chair[s]*))")
#[[1]]
#[1] "2"

#[[2]]
#[1] "1" "4"

#[[3]]
#[1] "4" "3"

#[[4]]
#[1] NA

#[[5]]
#[1] "1"

【讨论】:

  • 这非常接近我的需要。我将问题编辑得更具体一些。我需要输出为数字。提前致谢。
  • @johncarter 这很容易做到lapply(str_extract_all(list, "[0-9](?=\\s*(books|chair[s]*))"), as.numeric)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 2020-10-08
  • 2014-01-20
  • 1970-01-01
相关资源
最近更新 更多