【问题标题】:Replace the first characters in a vector of strings in R替换R中字符串向量中的第一个字符
【发布时间】:2020-07-09 15:31:19
【问题描述】:

所以我有一个字符串向量(不是故意格式化为时间)。

TIME
00:35 AM
08:34 AM
10:10 AM
10:00 PM
09:45 PM
02:00 PM
07:47 PM
12:22AM

我想让前面的 0 消失。如果有两个前导 0,则它必须是 12。请注意最后条目中的额外空格,一些数据的格式是这样的,因此解决方案必须考虑到这一点。

期望的最终结果:

TIME
12:35 AM
 8:34 AM
10:10 AM
10:00 PM
 9:45 PM
 2:00 PM
 7:47 PM
12:22 AM

首选 Tidyverse 解决方案,但我尝试使用 str_remove 无济于事。

【问题讨论】:

  • 不应该把多余的空间去掉吗?
  • 这也是正确的,但是如果这妨碍了解决真正的问题,那么可以忽略
  • @Nate 倒退了,应该有的地方没有了
  • 这能回答你的问题吗? Formatting a date in R without leading zeros

标签: r string dplyr


【解决方案1】:
library(magrittr) # Other packages import the %>% also nowadays
x %>% sub("^00", "12", .) %>% sub("^0", "", .)
# [1] "12:35 AM"  "8:34 AM"   "10:10 AM"  "10:00 PM"  "9:45 PM"   "2:00 PM"   "7:47 PM"   "12:22  AM"

可重现的数据:

x <- c("00:35 AM", "08:34 AM", "10:10 AM", "10:00 PM", "09:45 PM", "02:00 PM", "07:47 PM", "12:22  AM")

【讨论】:

    【解决方案2】:

    使用 base sub 和正则表达式将字符串开头的 00:00 替换为 12:00:

    sub("^00", "12", "00:35 AM")

    将返回 ""12:35 AM"。要删除前导 0,请在之后使用 sub

    sub("^0", "", "03:35 AM")"

    将返回“凌晨 3:35” 希望你能理解

    最好的

    【讨论】:

      【解决方案3】:

      你可以用这个:

      Time <- c("00:35 AM", "08:34 AM", "10:10 AM", "22:00 PM", "21:45 PM", "02:00 AM", "07:47 AM", "14:22  PM")
      
      Time2 <- ifelse(substring(Time,1,1)=='0',substring(Time,2,nchar(Time)),Time)
      

      【讨论】:

        【解决方案4】:

        这个解决方案还考虑了AMPM 附加到变量TIME 的数字部分的情况

        data %>% 
          mutate(TIME = ifelse(!grepl(" ", TIME),
                               sub("(AM$)|(PM$)", " \\1\\2", sub("^0", "", sub("^00", "12", TIME))),
                               sub("^0", "", sub("^00", "12", TIME)))) 
        

        " \\1\\2" 替换意味着它采用正则表达式模式的第一个或第二个带括号的子表达式 - (AM$)(PM$)

        输出

        #       TIME
        # 1 12:35 AM
        # 2  8:34 AM
        # 3 10:10 AM
        # 4 10:00 PM
        # 5  9:45 PM
        # 6  2:00 PM
        # 7  7:47 PM
        # 8 12:22 AM
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-12-11
          • 2020-03-10
          • 2015-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-21
          相关资源
          最近更新 更多