R语言 在月份数字字符串中插入前导零

q5lcpyga  于 2023-11-14  发布在  其他
关注(0)|答案(2)|浏览(128)

我有一个输入月份的字符串,例如,十月是"10",十一月是"11"
我的第一个目标是在字符串中导出下一个月的数字,例如,如果字符串是"10",我的输出应该是"11"

mon_num <- "09"
as.character(match(month.abb[as.numeric(mon_num) + 1], month.abb))

字符串
我的第二个要求是字符串应该有两个字符。这意味着,如果输入字符串是"02",输出应该是"03"。然而,上面的行产生"3"。有没有办法派生"03"而不是"3"
我的第二个问题是,如果输入是"12",输出是NA。如何使它成为"01"

ivqmmu1c

ivqmmu1c1#

这里有一个函数来处理这个问题-

get_next_month <- function(mon_num) {
  stopifnot("month number should be between 1 and 12" = 
            mon_num >= 1 && mon_num <= 12)
  if(mon_num == 12) return("01")
  nm <- match(month.abb[as.numeric(mon_num) + 1], month.abb)  
  sprintf("%02i", nm)
}

get_next_month(2)
#[1] "03"
get_next_month(10)
#[1] "11"
get_next_month(12)
#[1] "01"
get_next_month(15)

字符串
get_next_month(15)中的错误:月数应介于1和12之间

s4n0splo

s4n0splo2#

虽然不像另一个答案那样完整,但这将在一行中工作:

month_num <- "12"

sprintf("%02i", as.integer(month_num) %% 12 + 1)
# [1] "01"

字符串

Edit -用于处理vectors/data.frames的函数

如果添加新列的函数有用,这将a)用下一个月替换所有月份,B)过滤掉所有无效月份号(>12;警告)和c)安全地返回向量/新列。

add_chr_month <- function(months_in) {
  
  months_in <- as.integer(months_in)
  
  months_out <- sprintf("%02i", months_in %% 12 + 1)
  
  if(any(months_in > 12| months_in < 1)) {
    warning("Month values >12 or <1 detected, replacing with `NA`")
  }
  
  replace(months_out, months_in > 12 | months_in < 1, NA_character_)
  
}

df <- data.frame(months_in = sample(sprintf("%02i", 0:13)))

df$months_out <- add_chr_month(df$months_in)
#> Warning in add_chr_month(df$months_in): Month values >12 or <1 detected,
#> replacing with `NA`

df
#>    months_in months_out
#> 1         10         11
#> 2         00       <NA>
#> 3         11         12
#> 4         03         04
#> 5         02         03
#> 6         12         01
#> 7         04         05
#> 8         01         02
#> 9         09         10
#> 10        13       <NA>
#> 11        08         09
#> 12        05         06
#> 13        06         07
#> 14        07         08

相关问题