将数据帧值分解为四分位数/十分位数范围

时间:2018-05-21 02:53:12

标签: r cut quantile discretization

我正在尝试创建与我的数据框值相对应的十进制因子。我希望这些因素显示为范围,例如:如果值为“164”,则因子结果应为“160-166”。

过去我会这样做:

quantile(countries.Imported$Imported, seq(0,1, 0.1), na.rm = T) # display deciles
Imported.levels <- c(0, 1000, 10000, 20000, 30000, 50000, 80000) # create levels from observed deciles
Imported.labels <- c('< 1,000t', '1,000t - 10,000t', '10,000t - 20,000t', etc) # create corresponding labels 
colfunc <- colorRampPalette(c('#E5E4E2', '#8290af','#512888'))

# apply factor function
Imported.colors <- colfunc(10)
names(Imported.colors) <- Imported.labels
countries.Imported$Imported.fc <- factor(
cut(countries.Imported$Imported, Imported.levels),labels = Imported.labels)

相反,我想应用一个将值分解为十分位数范围的函数。我想避免手动设置因子标签,因为我将运行许多查询并绘制具有离散图例的地图。我创建了一个名为Value.fc的列,但我无法将其格式化为“(160,166)”中的“160 - 166”。请参阅下面有问题的代码:

corn_df <- corn_df %>%
mutate(Value.fc = gtools::quantcut(Value, 10))

corn_df %>%
select(Value, unit_desc, domain_desc, Value.fc) %>%
head(6)
A tibble: 6 x 4
Value     unit_desc     domain_desc  Value.fc 
<dbl>     <chr>         <chr>        <fct>    
1  164.   BU / ACRE     TOTAL        (160,166]
2  196.   BU / ACRE     TOTAL        (191,200]
3  203.   BU / ACRE     TOTAL        (200,230]
4  205.   BU / ACRE     TOTAL        (200,230]
5  172.   BU / ACRE     TOTAL        (171,178]
6  213.   BU / ACRE     TOTAL        (200,230]

1 个答案:

答案 0 :(得分:0)

您可以尝试使用dplyr::ntile()Hmisc::cut2()

如果您对变量开始和结束的下降感兴趣,可以使用Hmisc::cut2()stringr::str_extract_all()

require(tidyverse)
require(Hmisc)
require(stringr)

df <- data.frame(value = 1:100) %>%
  mutate(decline = cut2(value, g=10),
         decline = factor(sapply(str_extract_all(decline, "\\d+"),
                          function(x) paste(x, collapse="-"))))

head(df) 

  value decline
1     1    1-11
2     2    1-11
3     3    1-11
4     4    1-11
5     5    1-11
6     6    1-11

如果您只关注变量的下降,可以使用dplyr::ntile()

require(tidyverse)

df <- data.frame(value = 1:100) %>%
  mutate(decline = ntile(value, 10))  

head(df)

  value decline
1     1       1
2     2       1
3     3       1
4     4       1
5     5       1
6     6       1