我有一个类似于:
的列表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。感谢。
答案 0 :(得分:3)
对于每个字符串的多个匹配项,请尝试:
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
或表兄弟会做类似的工作。
答案 1 :(得分: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"