Groups numeric age values into categorized age bands using one of three methods: fixed interval ("interval"), equal distance ("distance"), or quantile-based grouping ("quantile"). Supports flexible labeling and language-specific suffixes.

cutage(
  x,
  method = "distance",
  length = 5,
  maxage = 85,
  sep_zero = TRUE,
  breaks = c(seq(0, 85, 5)),
  labels = NULL,
  lang = "cn",
  label_tail = NULL,
  right = FALSE
)

Arguments

x

Numeric vector of ages.

method

Character. Grouping method: "interval" (custom breaks), "distance" (uniform width), or "quantile" (equal-sized groups).

length

Integer. Width of age bands (used only if method = "distance"). Default is 5.

maxage

Numeric. Upper limit of the age range (used in "distance" method).

sep_zero

Logical. Whether to separate age 0 into its own group (only used if method = "distance"). Default is TRUE.

breaks

Numeric vector of breakpoints (required if method = "interval").

labels

Character vector of labels for resulting age groups. If NULL, default interval-style labels are generated.

lang

Output language for default labels, "cn" (Chinese) or "en" (English). Default is "cn".

label_tail

Character string appended to labels, e.g., "yrs". Default depends on lang.

right

Logical. Whether intervals are right-closed. Passed to cut(). Default is FALSE.

Value

A factor variable of age groups with labeled levels.

Examples

ages <- sample(0:101, 200, replace = TRUE)
cutage(ages, method = "distance", length = 5, maxage = 60, sep_zero = TRUE)
#>   [1] 25-29 岁 40-44 岁 60+ 岁   5-9 岁   60+ 岁   30-34 岁 60+ 岁   15-19 岁
#>   [9] 60+ 岁   35-39 岁 55-59 岁 15-19 岁 30-34 岁 60+ 岁   30-34 岁 60+ 岁  
#>  [17] 1-4 岁   60+ 岁   60+ 岁   1-4 岁   20-24 岁 5-9 岁   50-54 岁 60+ 岁  
#>  [25] 60+ 岁   40-44 岁 15-19 岁 40-44 岁 30-34 岁 5-9 岁   60+ 岁   60+ 岁  
#>  [33] 45-49 岁 15-19 岁 40-44 岁 60+ 岁   60+ 岁   50-54 岁 50-54 岁 60+ 岁  
#>  [41] 60+ 岁   60+ 岁   60+ 岁   60+ 岁   15-19 岁 60+ 岁   1-4 岁   45-49 岁
#>  [49] 1-4 岁   10-14 岁 20-24 岁 45-49 岁 60+ 岁   60+ 岁   1-4 岁   35-39 岁
#>  [57] 60+ 岁   60+ 岁   10-14 岁 40-44 岁 60+ 岁   60+ 岁   35-39 岁 60+ 岁  
#>  [65] 60+ 岁   60+ 岁   35-39 岁 60+ 岁   60+ 岁   30-34 岁 60+ 岁   60+ 岁  
#>  [73] 60+ 岁   45-49 岁 60+ 岁   20-24 岁 60+ 岁   5-9 岁   60+ 岁   35-39 岁
#>  [81] 60+ 岁   30-34 岁 60+ 岁   60+ 岁   35-39 岁 60+ 岁   20-24 岁 40-44 岁
#>  [89] 40-44 岁 60+ 岁   60+ 岁   40-44 岁 35-39 岁 35-39 岁 30-34 岁 60+ 岁  
#>  [97] 10-14 岁 60+ 岁   20-24 岁 60+ 岁   60+ 岁   60+ 岁   30-34 岁 25-29 岁
#> [105] 60+ 岁   45-49 岁 45-49 岁 60+ 岁   60+ 岁   60+ 岁   60+ 岁   60+ 岁  
#> [113] 40-44 岁 35-39 岁 40-44 岁 60+ 岁   25-29 岁 10-14 岁 15-19 岁 60+ 岁  
#> [121] 15-19 岁 60+ 岁   60+ 岁   60+ 岁   40-44 岁 5-9 岁   35-39 岁 60+ 岁  
#> [129] 60+ 岁   60+ 岁   60+ 岁   10-14 岁 1-4 岁   15-19 岁 60+ 岁   10-14 岁
#> [137] 30-34 岁 25-29 岁 20-24 岁 60+ 岁   60+ 岁   15-19 岁 60+ 岁   35-39 岁
#> [145] 45-49 岁 30-34 岁 60+ 岁   25-29 岁 45-49 岁 10-14 岁 50-54 岁 25-29 岁
#> [153] 60+ 岁   45-49 岁 60+ 岁   45-49 岁 50-54 岁 5-9 岁   60+ 岁   10-14 岁
#> [161] 15-19 岁 55-59 岁 1-4 岁   60+ 岁   30-34 岁 45-49 岁 60+ 岁   60+ 岁  
#> [169] 40-44 岁 5-9 岁   40-44 岁 20-24 岁 60+ 岁   15-19 岁 60+ 岁   60+ 岁  
#> [177] 55-59 岁 5-9 岁   50-54 岁 10-14 岁 5-9 岁   1-4 岁   25-29 岁 45-49 岁
#> [185] 60+ 岁   60+ 岁   25-29 岁 60+ 岁   10-14 岁 5-9 岁   60+ 岁   60+ 岁  
#> [193] 60+ 岁   60+ 岁   55-59 岁 60+ 岁   25-29 岁 60+ 岁   60+ 岁   60+ 岁  
#> 14 Levels: 0 岁 1-4 岁 5-9 岁 10-14 岁 15-19 岁 20-24 岁 25-29 岁 ... 60+ 岁
# Custom breaks
cutage(ages, method = "interval", breaks = c(0, 15, 30, 45, 60, 75, Inf))
#>   [1] 15-29 岁 30-44 岁 75+ 岁   0-14 岁  75+ 岁   30-44 岁 75+ 岁   15-29 岁
#>   [9] 60-74 岁 30-44 岁 45-59 岁 15-29 岁 30-44 岁 75+ 岁   30-44 岁 60-74 岁
#>  [17] 0-14 岁  60-74 岁 75+ 岁   0-14 岁  15-29 岁 0-14 岁  45-59 岁 75+ 岁  
#>  [25] 75+ 岁   30-44 岁 15-29 岁 30-44 岁 30-44 岁 0-14 岁  60-74 岁 60-74 岁
#>  [33] 45-59 岁 15-29 岁 30-44 岁 75+ 岁   60-74 岁 45-59 岁 45-59 岁 60-74 岁
#>  [41] 60-74 岁 75+ 岁   75+ 岁   75+ 岁   15-29 岁 75+ 岁   0-14 岁  45-59 岁
#>  [49] 0-14 岁  0-14 岁  15-29 岁 45-59 岁 60-74 岁 75+ 岁   0-14 岁  30-44 岁
#>  [57] 60-74 岁 75+ 岁   0-14 岁  30-44 岁 60-74 岁 60-74 岁 30-44 岁 60-74 岁
#>  [65] 75+ 岁   75+ 岁   30-44 岁 75+ 岁   75+ 岁   30-44 岁 75+ 岁   60-74 岁
#>  [73] 75+ 岁   45-59 岁 60-74 岁 15-29 岁 60-74 岁 0-14 岁  60-74 岁 30-44 岁
#>  [81] 75+ 岁   30-44 岁 75+ 岁   60-74 岁 30-44 岁 75+ 岁   15-29 岁 30-44 岁
#>  [89] 30-44 岁 75+ 岁   75+ 岁   30-44 岁 30-44 岁 30-44 岁 30-44 岁 75+ 岁  
#>  [97] 0-14 岁  75+ 岁   15-29 岁 75+ 岁   75+ 岁   75+ 岁   30-44 岁 15-29 岁
#> [105] 75+ 岁   45-59 岁 45-59 岁 60-74 岁 75+ 岁   75+ 岁   75+ 岁   75+ 岁  
#> [113] 30-44 岁 30-44 岁 30-44 岁 75+ 岁   15-29 岁 0-14 岁  15-29 岁 75+ 岁  
#> [121] 15-29 岁 75+ 岁   75+ 岁   75+ 岁   30-44 岁 0-14 岁  30-44 岁 60-74 岁
#> [129] 75+ 岁   60-74 岁 75+ 岁   0-14 岁  0-14 岁  15-29 岁 75+ 岁   0-14 岁 
#> [137] 30-44 岁 15-29 岁 15-29 岁 75+ 岁   60-74 岁 15-29 岁 60-74 岁 30-44 岁
#> [145] 45-59 岁 30-44 岁 75+ 岁   15-29 岁 45-59 岁 0-14 岁  45-59 岁 15-29 岁
#> [153] 60-74 岁 45-59 岁 75+ 岁   45-59 岁 45-59 岁 0-14 岁  75+ 岁   0-14 岁 
#> [161] 15-29 岁 45-59 岁 0-14 岁  75+ 岁   30-44 岁 45-59 岁 60-74 岁 75+ 岁  
#> [169] 30-44 岁 0-14 岁  30-44 岁 15-29 岁 75+ 岁   15-29 岁 75+ 岁   75+ 岁  
#> [177] 45-59 岁 0-14 岁  45-59 岁 0-14 岁  0-14 岁  0-14 岁  15-29 岁 45-59 岁
#> [185] 60-74 岁 60-74 岁 15-29 岁 60-74 岁 0-14 岁  0-14 岁  75+ 岁   75+ 岁  
#> [193] 75+ 岁   75+ 岁   45-59 岁 75+ 岁   15-29 岁 75+ 岁   60-74 岁 75+ 岁  
#> Levels: 0-14 岁 15-29 岁 30-44 岁 45-59 岁 60-74 岁 75+ 岁
# Quantile-based grouping
cutage(ages, method = "quantile")
#>   [1] 1-25.75 岁  26.75-48 岁 80-100 岁   1-25.75 岁  80-100 岁   26.75-48 岁
#>   [7] 80-100 岁   1-25.75 岁  49-79 岁    26.75-48 岁 49-79 岁    1-25.75 岁 
#>  [13] 26.75-48 岁 80-100 岁   26.75-48 岁 49-79 岁    1-25.75 岁  49-79 岁   
#>  [19] 80-100 岁   1-25.75 岁  1-25.75 岁  1-25.75 岁  49-79 岁    80-100 岁  
#>  [25] 80-100 岁   26.75-48 岁 1-25.75 岁  26.75-48 岁 26.75-48 岁 1-25.75 岁 
#>  [31] 49-79 岁    49-79 岁    26.75-48 岁 1-25.75 岁  26.75-48 岁 80-100 岁  
#>  [37] 49-79 岁    49-79 岁    49-79 岁    49-79 岁    49-79 岁    80-100 岁  
#>  [43] 80-100 岁   80-100 岁   1-25.75 岁  80-100 岁   1-25.75 岁  26.75-48 岁
#>  [49] 1-25.75 岁  1-25.75 岁  1-25.75 岁  26.75-48 岁 49-79 岁    80-100 岁  
#>  [55] 1-25.75 岁  26.75-48 岁 49-79 岁    49-79 岁    1-25.75 岁  26.75-48 岁
#>  [61] 49-79 岁    49-79 岁    26.75-48 岁 49-79 岁    49-79 岁    80-100 岁  
#>  [67] 26.75-48 岁 80-100 岁   80-100 岁   26.75-48 岁 80-100 岁   49-79 岁   
#>  [73] 80-100 岁   26.75-48 岁 49-79 岁    1-25.75 岁  49-79 岁    1-25.75 岁 
#>  [79] 49-79 岁    26.75-48 岁 80-100 岁   26.75-48 岁 80-100 岁   49-79 岁   
#>  [85] 26.75-48 岁 80-100 岁   1-25.75 岁  26.75-48 岁 26.75-48 岁 80-100 岁  
#>  [91] 80-100 岁   26.75-48 岁 26.75-48 岁 26.75-48 岁 26.75-48 岁 80-100 岁  
#>  [97] 1-25.75 岁  80-100 岁   1-25.75 岁  80-100 岁   49-79 岁    80-100 岁  
#> [103] 26.75-48 岁 26.75-48 岁 80-100 岁   49-79 岁    26.75-48 岁 49-79 岁   
#> [109] 80-100 岁   80-100 岁   80-100 岁   <NA>        26.75-48 岁 26.75-48 岁
#> [115] 26.75-48 岁 80-100 岁   1-25.75 岁  1-25.75 岁  1-25.75 岁  <NA>       
#> [121] 1-25.75 岁  80-100 岁   80-100 岁   80-100 岁   26.75-48 岁 1-25.75 岁 
#> [127] 26.75-48 岁 49-79 岁    80-100 岁   49-79 岁    80-100 岁   1-25.75 岁 
#> [133] 1-25.75 岁  1-25.75 岁  49-79 岁    1-25.75 岁  26.75-48 岁 26.75-48 岁
#> [139] 1-25.75 岁  80-100 岁   49-79 岁    1-25.75 岁  49-79 岁    26.75-48 岁
#> [145] 49-79 岁    26.75-48 岁 49-79 岁    26.75-48 岁 26.75-48 岁 1-25.75 岁 
#> [151] 49-79 岁    26.75-48 岁 49-79 岁    49-79 岁    49-79 岁    26.75-48 岁
#> [157] 49-79 岁    1-25.75 岁  49-79 岁    1-25.75 岁  1-25.75 岁  49-79 岁   
#> [163] 1-25.75 岁  80-100 岁   26.75-48 岁 26.75-48 岁 49-79 岁    80-100 岁  
#> [169] 26.75-48 岁 1-25.75 岁  26.75-48 岁 1-25.75 岁  80-100 岁   1-25.75 岁 
#> [175] 80-100 岁   80-100 岁   49-79 岁    1-25.75 岁  49-79 岁    1-25.75 岁 
#> [181] 1-25.75 岁  1-25.75 岁  26.75-48 岁 49-79 岁    49-79 岁    49-79 岁   
#> [187] 1-25.75 岁  49-79 岁    1-25.75 岁  1-25.75 岁  80-100 岁   49-79 岁   
#> [193] 80-100 岁   80-100 岁   49-79 岁    80-100 岁   1-25.75 岁  80-100 岁  
#> [199] 49-79 岁    80-100 岁  
#> Levels: 1-25.75 岁 26.75-48 岁 49-79 岁 80-100 岁