R语言中cut函数无法生成预期数量的区间该如何解决?
解决R中cut函数强制生成指定数量区间并让每个区间都有数据的问题
你遇到的问题是因为cut()函数在传入整数作为breaks参数时,会调用pretty()生成“美观”的断点,而非严格按指定数量划分区间。当数据范围狭窄时,这种“美观”的断点可能导致部分区间没有数据,就像你设置3个区间时Medium类别为空的情况。
下面提供两种可行的解决方法:
方法1:按分位数划分断点(保证每个区间有数据)
通过quantile()计算数据的分位数作为断点,确保每个区间都能分配到数据:
temp <- c(8.32, 8.43, 8.41, 7.86, 7.98, 7.86, 8.07, 8.51, 7.92, 7.94, 8.36) # 生成0%、33.3%、66.6%、100%分位数作为4个断点(对应3个区间) bins <- quantile(temp, probs = seq(0, 1, length.out = 4)) labels <- c("Low","Medium","High") # include.lowest=TRUE确保最小值被包含在第一个区间 categories <- cut(temp, breaks = bins, labels = labels, include.lowest = TRUE) categories
运行后你会看到Medium类别出现,分位数划分会把数据相对均匀地分配到各个区间。
方法2:强制等距划分区间(不管区间大小)
用seq()生成严格等距的断点,强制分成指定数量的区间:
temp <- c(8.32, 8.43, 8.41, 7.86, 7.98, 7.86, 8.07, 8.51, 7.92, 7.94, 8.36) min_temp <- min(temp) max_temp <- max(temp) # 从最小值到最大值,生成4个等距断点(对应3个区间) bins <- seq(min_temp, max_temp, length.out = 4) labels <- c("Low","Medium","High") categories <- cut(temp, breaks = bins, labels = labels, include.lowest = TRUE) categories
这种方法会忽略“美观”的断点要求,严格按等距划分,即使区间范围很小,也能保证每个区间都有数据(只要数据不是完全相同)。
内容的提问来源于stack exchange,提问作者Katherine Chau
相关产品推荐
相关产品推荐

