我得到一个向量x,它包含以下字符串价格区间
x <- c("$100-$150","$90-$120","$30-$50")
我该如何编写一个函数,以数字形式返回一个包含每个区间最小值的向量?
x <- c(100,90,30)
此外,我该如何编写一个做同样事情但返回最大值的函数?
您可以使用基于R的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";,每个包含整数值
使用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
我们可以使用parse_number
library(readr)
parse_number(x)
#[1] 100 90 30
或来自base R
的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")
使用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