找到最简洁的方法是什么?例如字符串":[1-9] *"并且只保留那部分?
你可以使用regexec来获得起点,但是不是有更简洁的方法来获得价值吗?
例如:
test <- c("surface area: 458", "bedrooms: 1", "whatever")
regexec(": [1-9]*", test)
我如何立即获得
c(": 458",": 1", NA )
答案 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