【问题标题】:Conditionally formatting a column with mutate and regex in R在 R 中使用 mutate 和 regex 有条件地格式化列
【发布时间】:2022-01-02 03:44:53
【问题描述】:

我是 R 和一般编程方面的新手。我有一列包含日期列表。有些是“2020 年 1 月 1 日”格式,有些只有月份和年份(即只有“2020 年 1 月”)。我想将它们变异到一个新字段,在该字段中我在所有月年格式的日期前面添加一个 01,然后我将使用 lubridate 将其处理为日期

这是我尝试过的。我正在尝试提取 Date 列的第一个字符。如果它是大写字母,那么我将在其后面附加“01”。我正在使用包含 dplyr 的 tinyverse 包

df %>% mutate(new_date = ifelse(str_sub(Date, start = 1, end = 1)== "[:upper:]"), paste('01', Date, sep = ' '), new_date = Date)

我收到错误消息“no is missing”,但我认为我已包含 new_date = Date 以保持当前格式。

感谢您的帮助!

【问题讨论】:

  • 非常感谢。如果我在条件中输入特定字母以匹配,它似乎可以工作,但不适用于正则表达式“[:upper:]”。正则表达式的格式是否正确?

标签: r regex if-statement conditional-statements


【解决方案1】:

这可以通过多种方式完成。

base R 使用前瞻和后向引用:

sub("(^)(?=[A-Za-z]+)", "\\101 ", date, perl = TRUE)
[1] "01 January 2020"  "01 January 2020"  "12 February 1999" "01 March 2033"

base R 仅使用反向引用:

sub("(^[A-Za-z]+)", "01 \\1", date, perl = TRUE)

dplyrstringr 使用相同的逻辑:

library(dplyr)
library(stringr)

data.frame(date) %>%
  mutate(date = str_replace(date, "(^)(?=[A-Za-z]+)", "\\101 "))

如果你坚持使用ifelse:

library(dplyr)
library(stringr)

data.frame(date) %>% 
  mutate(date = ifelse(str_detect(date, "^[:upper:]"),
                       sub("^", "01 ", date),
                       date))

数据:

date <- c("01 January 2020","January 2020", "12 February 1999", "March 2033")

【讨论】:

    【解决方案2】:

    这是一个非正则表达式选项,我们将其转换为 Date 类和 format

    library(parsedate)
    format(parse_date(date), '%d %B %Y')
    [1] "01 January 2020"  "01 January 2020"  "12 February 1999" "01 March 2033"  
    

    数据

    date <- c("01 January 2020","January 2020", "12 February 1999", "March 2033")
    

    【讨论】:

      猜你喜欢
      • 2012-07-11
      • 2019-07-16
      • 2021-07-03
      • 2020-09-09
      • 1970-01-01
      • 2021-07-09
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多