如何将值的数量转换为它在 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)
如果您有数万个值和数百个间隔要分类,可能需要一段时间。即使使用此代码,如果您需要,我们也可以在性能方面做得更好。
希望是你想要的。
汤姆
我正在处理一个问题,将一列中的服务编号分配为其相应的特征间隔。 间隔及其原始值示例如下所示
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)
如果您有数万个值和数百个间隔要分类,可能需要一段时间。即使使用此代码,如果您需要,我们也可以在性能方面做得更好。
希望是你想要的。
汤姆