如何基于另一列数值范围对R语言DataFrame进行条件分箱?
足球传球坐标的条件分箱实现
原始数据与初始分箱代码
首先是你创建的DataFrame及初始分箱逻辑:
# 创建数据框 data <- as.data.frame(matrix(runif(n=400, min=1, max=100), nrow=100)) names(data) <- c('x', 'y', 'endX', 'endY') # 初始分箱代码 data$xbin <- cut(data$x, breaks = c(0, 17, 50, 66, 83, 100),include.lowest=TRUE) data$ybin <- cut(data$y, breaks = c(0, 21.1, 36.8, 63.2, 78.9, 100),include.lowest=TRUE) data$endXbin <- cut(data$endX, breaks = c(0, 21.1, 36.8, 63.2, 78.9, 100), include.lowest=TRUE) data$endYbin <- cut(data$endY, breaks = c(0, 21.1, 36.8, 63.2, 78.9, 100), include.lowest=TRUE)
需求说明
需要实现条件分箱逻辑:当x处于0-17或83-100区间时,对y列使用简化的分箱规则breaks = c(0, 36.8, 63.2, 100);其余情况保持原有分箱规则。
优雅实现方案
方案1:基础R原生实现
通过ifelse函数结合预定义的分箱规则,直接完成条件分箱:
# 预定义两种分箱断点 breaks_y_default <- c(0, 21.1, 36.8, 63.2, 78.9, 100) breaks_y_special <- c(0, 36.8, 63.2, 100) # 按x的区间条件对y分箱 data$ybin <- ifelse( data$x >= 0 & data$x <= 17 | data$x >= 83 & data$x <= 100, cut(data$y, breaks = breaks_y_special, include.lowest = TRUE), cut(data$y, breaks = breaks_y_default, include.lowest = TRUE) )
方案2:dplyr管道式实现(更简洁)
如果习惯使用dplyr的数据流风格,用case_when可以更清晰地写出多条件逻辑:
library(dplyr) data <- data %>% mutate( # 对y列应用条件分箱 ybin = case_when( x >= 0 & x <= 17 | x >= 83 & x <= 100 ~ cut(y, breaks = c(0, 36.8, 63.2, 100), include.lowest = TRUE), TRUE ~ cut(y, breaks = c(0, 21.1, 36.8, 63.2, 78.9, 100), include.lowest = TRUE) ), # 若需要对endY按endX的条件分箱,可直接复用逻辑 endYbin = case_when( endX >= 0 & endX <= 17 | endX >= 83 & endX <= 100 ~ cut(endY, breaks = c(0, 36.8, 63.2, 100), include.lowest = TRUE), TRUE ~ cut(endY, breaks = c(0, 21.1, 36.8, 63.2, 78.9, 100), include.lowest = TRUE) ) )
补充说明
两种方案都能高效实现需求,dplyr版本更适合整合进复杂的数据处理流程中,代码可读性更强。如果需要对其他列(如endX/endY)复用相同逻辑,只需替换判断条件和目标列即可。
内容的提问来源于stack exchange,提问作者Delopera
相关产品推荐
相关产品推荐

