基于观察分布/频率的连续数据分箱来决定分箱范围 r dplyr
Posted
技术标签:
【中文标题】基于观察分布/频率的连续数据分箱来决定分箱范围 r dplyr【英文标题】:Continuous data binning based on observation distribution/frequency to decide bin range r dplyr 【发布时间】:2021-08-29 00:56:51 【问题描述】:我已经好几天没有运气扫描互联网寻求有关此问题的帮助。任何建议将不胜感激! (尤其是对 tidyverse 友好的语法)
我有一个大约 tibble。 4300 行/obs 和 320 列。一列是我的因变量,一个称为“RR”(响应比率)的连续数字列。我的目标是将 RR 值分成 10 个因子水平。稍后用于机器学习分类。
我已经用这段代码试验了 cut() 函数:
df <- era.af.Al_noNaN %>%
rationalize() %>%
drop_na(RR) %>%
mutate(RR_MyQuantile = cut(RR,
breaks = unique(quantile(RR, probs = seq.int(0,1, by = 1 / numbers_of_bins))),
include.lowest = TRUE))
但是我没有运气,因为我的 bin 在每个 bin 中都有相等的 n,但是,这并不能反映数据的分布。我在这里研究了一点 https://towardsdatascience.com/understanding-feature-engineering-part-1-continuous-numeric-data-da4e47099a7b 但我根本无法在R.
Here is the distribution of my RR data values grouped into classes *not what I want
【问题讨论】:
那你想要什么? 【参考方案1】:您可以尝试hist()
来获得休息时间。它用于绘制直方图,但它还提供其他相关数据作为副作用。在下面的示例中,绘图被plot = FALSE
抑制以显示中断数据。然后,在cut()
中使用它。这应该会给你截止值,保持变量的分布。
hist(iris$Sepal.Length, breaks = 5, plot = FALSE)
# $breaks
# [1] 4 5 6 7 8
#
# $counts
# [1] 32 57 49 12
#
# ...<omitted>
breaks <- hist(iris$Sepal.Length, breaks = 5, plot = FALSE)$breaks
dat <- iris %>%
mutate(sepal_length_group = cut(Sepal.Length, breaks = breaks))
dat %>%
count(sepal_length_group)
# sepal_length_group n
# 1 (4,5] 32
# 2 (5,6] 57
# 3 (6,7] 49
# 4 (7,8] 12
【讨论】:
【参考方案2】:谢谢!
我还尝试使用 cut() 和 count()。然后我使用 labels=FALSE 给出标签,这些标签可以在新的变异中使用,用于带有间隔组的字符名称的新列..
numbers_of_bins = 10
df <- era.af.Al_noNaN %>%
rationalize() %>%
drop_na(RR) %>%
mutate(RR_MyQuantile = cut(RR,
breaks = unique(quantile(RR, probs = seq.int(0,1, by = 1 / numbers_of_bins))),
include.lowest = TRUE))
head(df$RR_MyQuantile,10)
df %>%
group_by(RR_MyQuantile) %>%
count()
【讨论】:
以上是关于基于观察分布/频率的连续数据分箱来决定分箱范围 r dplyr的主要内容,如果未能解决你的问题,请参考以下文章
R语言将连续数值转换为自定义间隔的离散类型数据(分类型标称型)实战: 自定义间隔的数据分箱