我得到了一个向量x,其中包含这些价格区间的字符串
x <- c("$100-$150","$90-$120","$30-$50")
如何编写一个函数,以数值形式返回每个区间的最小值向量?
x <- c(100,90,30)
此外,如何编写一个函数来执行相同的操作,但返回最大值?
strcapture
来获取一个包含区间最小值和最大值的data.frame
:strcapture("\\$([[:digit:]]+)-\\$([[:digit:]]+)", x,
data.frame(min = integer(), max = integer()))
## min max
## 1 100 150
## 2 90 120
## 3 30 50
"\\$([[:digit:]]+)-\\$([[:digit:]]+)"
)设置了两个数字捕获组。x
是我们正在读取的对象data.frame
,分别命名为"min"和"max",每列都包含整数值。使用 stringr
,您可以删除 $ 然后拆分字符串。第一行是最小值,第二行是最大值。
library(stringr)
y <- sapply(str_split(str_remove_all(x, "[$]"), "-", 2), as.numeric)
y
# [,1] [,2] [,3]
# [1,] 100 90 30
# [2,] 150 120 50
y_min <- y[1,]
y_max <- y[2,]
把它分解开来...
str_remove_all
用于删除 '$' 符号str_split
用于在 '-' 上拆分每个元素sapply
用于将每个新的字符向量转换为数字如果你想使用 dplyr
,你可以使用 separate()
。
library(dplyr)
library(tidyr)
library(stringr)
tibble(price = x) %>%
mutate(price = str_remove_all(price, "[$]")) %>%
separate(price, c("min", "max"), sep = "-", convert = TRUE)
# # A tibble: 3 x 2
# min max
# <int> <int>
# 1 100 150
# 2 90 120
# 3 30 50
parse_number
。library(readr)
parse_number(x)
#[1] 100 90 30
sub
。as.numeric(sub("\\$(\\d+)-.*", "\\1", x))
#[1] 100 90 30
as.numeric(sub(".*-\\$(\\d+)", "\\1", x))
#[1] 150 120 50
或者可以使用来自base R
的read.table
创建两列
read.table(text = gsub("$", "", x, fixed = TRUE), header = FALSE, sep="-")
# V1 V2
#1 100 150
#2 90 120
#3 30 50
x <- c("$100-$150","$90-$120","$30-$50")
regmatches
+ sapply
的基本R选项。> sapply(regmatches(x,gregexpr("\\d+",x)),function(x) min(as.numeric(x)))
[1] 100 90 30
min
和max
值,我们可以尝试type.convert(
setNames(
data.frame(
do.call(
rbind,
regmatches(x,gregexpr("\\d+",x)))),
c("min","max")),
as.is = TRUE
)
这提供了
min max
1 100 150
2 90 120
3 30 50
str_split()
函数将字符串分割成单独的部分也是一种选项,以便分离起始点和结束点。 - Reeza