在R中,是否有一种方法可以从字符串区间值中获取最小或最大值?

3

我得到了一个向量x,其中包含这些价格区间的字符串

x <- c("$100-$150","$90-$120","$30-$50")

如何编写一个函数,以数值形式返回每个区间的最小值向量?

x <- c(100,90,30)

此外,如何编写一个函数来执行相同的操作,但返回最大值?


使用 str_split() 函数将字符串分割成单独的部分也是一种选项,以便分离起始点和结束点。 - Reeza
4个回答

4
你可以使用基础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 是我们正在读取的对象
  • proto形式被定义为一个带有两列的data.frame,分别命名为"min"和"max",每列都包含整数值。

0

使用 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

0
我们可以使用parse_number
library(readr)
parse_number(x)
#[1] 100  90  30

或者使用来自基础 R 的 sub
as.numeric(sub("\\$(\\d+)-.*", "\\1", x))
#[1] 100  90  30

或者获取最大值。
as.numeric(sub(".*-\\$(\\d+)", "\\1", x))
#[1] 150 120  50

或者可以使用来自base Rread.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")

0
另一个使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接