找到例如字符串「:[1-9] *」並僅保留該部分的最簡潔方法是什麼?如何查找字符串中的某個部分並僅保留該部分
你可以使用regexec來獲得起點,但沒有一個更清晰的方法來立即獲得值嗎?
例如:
test <- c("surface area: 458", "bedrooms: 1", "whatever")
regexec(": [1-9]*", test)
如何立即得到公正
c(": 458",": 1", NA)
找到例如字符串「:[1-9] *」並僅保留該部分的最簡潔方法是什麼?如何查找字符串中的某個部分並僅保留該部分
你可以使用regexec來獲得起點,但沒有一個更清晰的方法來立即獲得值嗎?
例如:
test <- c("surface area: 458", "bedrooms: 1", "whatever")
regexec(": [1-9]*", test)
如何立即得到公正
c(": 458",": 1", NA)
library(stringr)
str_extract(test, ":.*")
#[1] ": 458" ": 1" NA
或者一個更快的方法stringi
library(stringi)
stri_extract_first_regex(test, ":.*")
#[1] ": 458" ": 1" NA
如果你需要保留值的一個臨屋區t沒有匹配
gsub(".*(:.*)", "\\1", test)
#[1] ": 458" ": 1" "whatever"
你可以使用base 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
嘗試任何這些。前兩個僅使用R的基礎。最後一個假設我們要返回一個數字向量。
1)子
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
感謝。這不是奇怪,這不是在R的標準軟件包? – 2014-08-31 17:27:33
@Kasper Van Lombeek我同意。我使用'stringr'很多 – akrun 2014-08-31 17:32:11
他確實需要NA值嗎? – hwnd 2014-08-31 17:32:27