如何获取R中ntile分组对应的mean_price截断值?
获取ntile分组对应的mean_price截断值
问题说明
你已经用ntile(mean_price, 5)把房价数据分成了5个分组,现在需要提取这5个分组对应的mean_price截断边界值。之前尝试用quantile但参数设置不对,以下是正确的解决方法。
原始数据预览
# A tibble: 52 × 3 provincia mean_price number_properties <chr> <dbl> <int> 1 A Coruña 179833. 2508 2 Albacete 148584. 1311 3 Alicante 418148. 22676 4 Almería 142338. 3902 5 Araba - Álava 243705. 786
已用分组代码
df %>% mutate( bins = ntile(mean_price, 5) )
之前尝试的错误代码
x = df %>% mutate( bins = ntile(mean_price, 52), bins_cutpoints = quantile(mean_price, probs = seq(0, 1, length.out = 52), na.rm = TRUE) )
解决方案
方法1:直接获取5分位数截断点
ntile(...,5)本质是把数据按5分位数分组,所以直接用quantile函数传入对应的分位数概率即可,代码如下:
# 计算5分组的截断值(包含最小值和最大值,共6个点对应5个区间) cutpoints <- quantile(df$mean_price, probs = seq(0, 1, 1/5), na.rm = TRUE) cutpoints
运行后会得到类似这样的结果:
0% 20% 40% 60% 80% 100% 113856.40 132623.63 160838.24 197388.05 340663.44 749037.54
方法2:将截断值与分组关联验证
如果想把每个分组和对应的截断值对应起来,可以先分组再统计边界,同时结合quantile的结果:
# 先添加分组,再统计每个组的价格范围,最后关联截断值 df_with_bins <- df %>% mutate(bins = ntile(mean_price, 5)) %>% group_by(bins) %>% summarize( group_min = min(mean_price), group_max = max(mean_price), .groups = "drop" ) %>% mutate( lower_cut = cutpoints[-length(cutpoints)], upper_cut = cutpoints[-1] ) df_with_bins
关键说明
ntile会尽量把数据均匀分成n个组,当总观测数不能被n整除时,前几个组会多1个观测quantile(..., probs = seq(0,1,1/n))生成的分位数点,正好对应ntile分组的边界,两者逻辑一致
完整数据
df <- structure(list(provincia = c("A Coruña", "Albacete", "Alicante", "Almería", "Araba - Álava", "Asturias", "Badajoz", "Barcelona", "Bizkaia", "Burgos", "Cantabria", "Castellón", "Ceuta", "Ciudad Real", "Cuenca", "Cáceres", "Cádiz", "Córdoba", "Gipuzkoa", "Girona", "Granada", "Guadalajara", "Huelva", "Huesca", "Illes Balears", "Jaén", "La Rioja", "Las Palmas", "León", "Lleida", "Lugo", "Madrid", "Melilla", "Murcia", "Málaga", "Navarra", "Ourense", "Palencia", "Pontevedra", "Salamanca", "Santa Cruz de Tenerife", "Segovia", "Sevilla", "Soria", "Tarragona", "Teruel", "Toledo", "Valencia", "Valladolid", "Zamora", "Zaragoza", "Ávila"), mean_price = c(179833.167862839, 148583.87109077, 418148.151437643, 142337.792926704, 243704.750636132, 149179.732438607, 147802.894486692, 462813.775190776, 286461.604484305, 134635.540239044, 201214.437926878, 139819.15323646, 204318.181818182, 113856.401715511, 116992.998609179, 143137.441025641, 251270.65520481, 166586.746650426, 340663.440746753, 365733.360551724, 219325.194605466, 173221.569037657, 142430.992912371, 141754.603535354, 749037.540922619, 131396.292428198, 160838.235963581, 656553.777123633, 140312.919506463, 160485.155614973, 129787.667711599, 433665.652781242, 234306.12244898, 188635.237652749, 687127.622056842, 197388.050991501, 137829.640394089, 123450.853813559, 230344.604904632, 159999.046077894, 328912.419004007, 184829.536144578, 180692.511036468, 155759.235955056, 193651.956693536, 128909.006756757, 132623.629553967, 177825.529404212, 165240.297002725, 116820.125531915, 164934.932635983, 124977.724215247), number_properties = c(2508L, 1311L, 22676L, 3902L, 786L, 3502L, 2104L, 35906L, 3345L, 1255L, 2489L, 4542L, 44L, 1399L, 719L, 1170L, 5322L, 5747L, 1232L, 7250L, 16906L, 956L, 1552L, 396L, 5376L, 1915L, 1318L, 2378L, 1702L, 1870L, 638L, 16036L, 49L, 7856L, 15587L, 706L, 1421L, 472L, 2569L, 1823L, 3494L, 498L, 6252L, 89L, 6327L, 296L, 2937L, 15576L, 1468L, 470L, 2390L, 446L)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -52L))
内容的提问来源于stack exchange,提问作者user113156
相关产品推荐
相关产品推荐

