如何查找字符串中的某个部分并仅保留该部分

时间:2014-08-31 17:19:54

标签: r

找到最简洁的方法是什么?例如字符串":[1-9] *"并且只保留那部分?

你可以使用regexec来获得起点,但是不是有更简洁的方法来获得价值吗?

例如:

test <- c("surface area: 458", "bedrooms: 1", "whatever")
regexec(": [1-9]*", test)

我如何立即获得

c(": 458",": 1", NA )

3 个答案:

答案 0 :(得分:8)

您可以使用基本R来处理这个问题。

> x <- c('surface area: 458', 'bedrooms: 1', 'whatever')
> r <- regmatches(x, gregexpr(':.*', x))
> unlist({r[sapply(r, length)==0] <- NA; r})
# [1] ": 458" ": 1"   NA  

虽然,我觉得这样做更简单......

> x <- c('surface area: 458', 'bedrooms: 1', 'whatever')
> sapply(strsplit(x, '\\b(?=:)', perl=T), '[', 2)
# [1] ": 458" ": 1"   NA 

答案 1 :(得分:7)

library(stringr)
str_extract(test, ":.*")
#[1] ": 458" ": 1"   NA     

或者更快的方法stringi

library(stringi)
stri_extract_first_regex(test, ":.*")
#[1] ": 458" ": 1"   NA     

如果您需要保留不匹配的值

gsub(".*(:.*)", "\\1", test)
#[1] ": 458"    ": 1"      "whatever"

答案 2 :(得分:4)

尝试其中任何一项。前两个只使用R的基数。最后一个假设我们想要返回一个数字向量。

1)sub

s <- sub(".*:", ":", test)
ifelse(test == s, NA, s)
## [1] ": 458" ": 1"   NA   

如果可以有多个:在字符串中,则用"^[^:]*:"替换模式。

2)strsplit

sapply(strsplit(test, ":"), function(x) c(paste0(":", x), NA)[2])
## [1] ": 458" ": 1"   NA

如果可以有一个以上的字符串,请不要使用此字符串。

3)strapplyc

library(gsubfn)
s <- strapplyc(test, "(:.*)|$", simplify = TRUE)
ifelse(s == "", NA, s)
## [1] ": 458" ": 1"   NA

如果ifelse可以,而不是"",我们可以省略NA行。

4)strapply 如果这个想法真的是线上有一些数字,我们想要返回数字或NA,那么试试这个:

library(gsubfn)
strapply(test, "\\d+|$", as.numeric, simplify = TRUE)
## [1] 458   1  NA