有没有办法从R中的字符串间隔值中获取最小值或最大值



我得到一个向量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

如果您想要同时具有minmax值,我们可以尝试

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 Rsub

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

最新更新