如何将值的数量转换为它在 R 中的区间?

How to convert numbers of values to be its intervals that it falls into in R?

我正在处理一个问题,将一列中的服务编号分配为其相应的特征间隔。 间隔及其原始值示例如下所示

VehicleDriverCarrierPremium_Interval<-c("(Null)",">= 0, <100",">= 100, < 200",">= 200, < 300",">= 300, < 400",">= 400, < 500",">= 500, < 600",">= 600, < 700",">= 700, < 800",">= 800, < 900")
VehicleDriverCarrierPremium<-c(423,12,NA,535,231,875)

最后我想要的是这样的:

VehicleDriverCarrierPremium [1] ">= 400, < 500" ">= 0, <100" "(Null)" ">= 500, < 600" ">= 200, < 300" ">= 800, < 900"

问题是原来的值是0到50000,区间级别实际上没有一定的规律,区间的长度会随着数值变大而变化。如果值大于 1000,则有一个逗号。例如, 最后两个间隔是:

">= 9,000, <10,000", ">= 10,000, <50,000"

我目前所做的是非常手动的,我将不同的区间分成几组并使用if和for语句将原始值转换为其对应的区间。但是当间隔级别和间隔长度发生变化时,我必须手动更改。

所以我想知道有没有更好的方法可以先读取间隔的级别,其类型是字符。然后将落入其对应区间的原始值改成其区间。

如果您有更多信息,请告诉我。谢谢!

您是否检查过 cut 函数是否不符合您的要求?

cut(VehicleDriverCarrierPremium, breaks = seq(0,10000, by = 100))

我没有使用标签参数,但我相信你甚至可以得到一些正确的东西并避免使用正则表达式

好的,这是另一种方法。 我很确定有更简单和更有效的方法。 我正在使用 tidyverse 将您的字符间隔转换为 2 列开始和结束。

library(tidyverse)
tibble(int_ID = c(">= 0, <100",
              ">= 100, <200",
              ">= 200, <1,000",
              ">= 1,000, <2,000",
              ">= 2,000, <3,000",
              ">= 3,000, <5,000",
              ">= 5,000, <50,000")) %>% 
  separate(int_ID, into=c("begin","end"), ", ",remove = FALSE) %>% 
  mutate(begin = str_sub(begin,4)) %>% 
  mutate(end = str_sub(end,2)) %>% 
  mutate_at(vars(begin,end),~as.integer(str_remove(.,","))) -> intervals

VehicleDriverCarrierPremium_factor <- c()
for(i in 1:length(VehicleDriverCarrierPremium) ){ # for each element
  print(VehicleDriverCarrierPremium[i])
  if(!is.na(VehicleDriverCarrierPremium[i])){
    for (j in 1:length(intervals$int_ID)){ # we test on which interval he goes
      if(VehicleDriverCarrierPremium[i]>= intervals$begin[j] & VehicleDriverCarrierPremium[i] < intervals$end[j]){
        VehicleDriverCarrierPremium_factor <- c(VehicleDriverCarrierPremium_factor, intervals$int_ID[j])
      }
    }
    }else{
      VehicleDriverCarrierPremium_factor <- c(VehicleDriverCarrierPremium_factor, "(Null)")

  }
  print(VehicleDriverCarrierPremium_factor)
}

VehicleDriverCarrierPremium<-c(423,12,NA,535,231,875,9000)

如果您有数万个值和数百个间隔要分类,可能需要一段时间。即使使用此代码,如果您需要,我们也可以在性能方面做得更好。

希望是你想要的。

汤姆