R:创建直方图箱来表示数据中的差距

R: Creating histogram bins to represent gaps in data

有没有一种方法可以使用“case_when”创建代表一系列数据中“人为”差距的分箱?我写的脚本有点用,但我无法用它来绘制我指定的数据间隙。我的尝试被忽略了:

我的数据:

> table(df$den)

                0 0.333333333333333 0.666666666666667                 1  1.33333333333333 
              507               155                77                43                18 
 1.66666666666667                 2  2.33333333333333                 3  3.33333333333333 
                7                 5                 8                 3                 1 
                4  4.33333333333333  5.66666666666667  8.33333333333333 
                1                 1                 2                 1 

生成 bin:

df = df %>% mutate(
  bins = case_when(
    den == 0 ~ "0",
    den <= 1 ~ "0 - 1",
    den <= 2 ~ "1 - 2",
    den <= 3 ~ "2 - 3",
    den <= 4 ~ "3 - 4",
    den <= 5 ~ "4 - 5",
    den <= 6 ~ "5 - 6",
    den <= 8 ~ "...",
    TRUE ~ "8.0+" 
  )
)

但是差距被忽略了:

> bins <- as.data.frame(table(df$bins))
> bins
   Var1 Freq
1     0  507
2 0 - 1  275
3 1 - 2   30
4 2 - 3   11
5 3 - 4    2
6 4 - 5    1
7 5 - 6    2
8  8.0+    1

我曾希望实现这样的目标,但“case_when”函数不会创建它:

>bins
       Var1 Freq
    1     0  507
    2 0 - 1  275
    3 1 - 2   30
    4 2 - 3   11
    5 3 - 4    2
    6 4 - 5    1
    7 5 - 6    2
    8 "..."    NA
    9  8.0+    1

其他方法也不起作用,而且创建起来很痛苦:

df$bins <- cut(df$den, c(0, seq(0.001, 9, 1)), right = FALSE,
                labels=c("0", "0.001 - 1.001", "1.002 - 2.001", "2.002 - 3.001", 
                         "3.002 - 4.001", "4.002 - 5.001", "5.002 - 6.001", 
                         "...", "8.0+")) 
    

ggplot:

  ggplot(bins, aes(x = Var1, y = Freq, fill = Var1)) + 
      geom_bar(stat = "identity", colour="black") + 
      geom_text(aes(label = Freq), vjust = -0.5) +
      scale_fill_brewer(breaks = c("0", "0-1","1-2", "2-3","3-4", "4-5", "5-6", "...", "8+"))
  

这有帮助吗?我假设 freq 是每个 bin 大小中的数字计数。

library(tidyverse)

df <- tibble(den = c(
  0, 0.333333333333333, 0.666666666666667, 1,
  1.33333333333333, 507, 155, 77,
  43, 18, 1.66666666666667, 2, 2.33333333333333,
  3, 3.33333333333333, 7, 5, 8, 3, 1, 4, 3333,
  5.66666666666667, 8.33333333333333, 1, 1, 2, 1
)) 

df |>
  mutate(bin = cut(den, breaks = c(0:8, Inf), right = FALSE)) |>
  count(bin, name = "freq") |>
  add_row(bin = "...", freq = NA_integer_) |>
  mutate(bin = fct_relevel(bin, "...", after = 7)) |>
  ggplot(aes(bin, freq, fill = bin)) +
  geom_bar(stat = "identity", colour = "black") +
  geom_text(aes(label = freq), vjust = -0.5) +
  scale_fill_brewer()
#> Warning: Removed 1 rows containing missing values (position_stack).
#> Warning: Removed 1 rows containing missing values (geom_text).

reprex package (v2.0.1)

于 2022-05-24 创建