【问题标题】:Mutate if col name contains 'dat' to date如果列名包含“日期”到日期,则进行变异
【发布时间】:2020-10-26 19:09:29
【问题描述】:

我有以下 df where num, chr, num

       dat a     idat
1 20200101 h 20200101
2 20200113 g 20200113
3 20200213 b 20200213

我想获取日期、字符、日期

       dat a     idat
1 2020-01-01 h 2020-01-01
2 2020-01-13 g 2020-01-13
3 2020-02-13 b 2020-02-13

我尝试了很多方法,包括:

df %>% 
  mutate_if(vars(contains("dat")), function(x) 
    {as.Date(as.character(x), "%Y%m%d")})

有人有什么建议吗?在此先感谢:)

【问题讨论】:

    标签: r data-manipulation dplyr


    【解决方案1】:

    我们需要mutate_at,而不是mutate_if。在较新版本的dplyr中,可以使用mutateacross来完成

    library(dplyr) # >= 1.0.0
    df1 <- df %>%
        mutate(across(contains('dat'), ~ as.Date(as.character(.), format = '%Y%m%d')))
    

    1.0.0之前,mutate_at可以用

    df1 <- df %>%
        mutate_at(vars(contains('dat')), ~as.Date(as.character(.), format = '%Y%m%d'))
    

    mutate_if 一般用于根据列的值检查某些条件,即

    df  %>%
          mutate_if(is.numeric, ~ as.Date(as.character(.), format = '%Y%m%d'))
    

    作为一个可重现的例子

    head(iris) %>%
             mutate_if(is.numeric, ~ .x * 5)
    

    【讨论】:

    • 谢谢!但是前两个给出了错误,这是因为datidat 列是数字吗?因此format = '%Y%m%d' 不起作用,因为它不是 chr?
    • @Maya 谢谢,我更正了。需要转换成character
    【解决方案2】:

    data.table 方法使用与 akun 的 tidyverse 答案相同的逻辑

    library( data.table )
    DT <- fread("dat a     idat
     20200101 h 20200101
     20200113 g 20200113
     20200213 b 20200213")
    
    cols <- grep( "dat", names(DT), value = TRUE )
    DT[, (cols) := lapply( .SD, function(x) as.Date( as.character(x), format = "%Y%m%d" ) ), .SDcols = cols ][]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 2021-11-30
      • 2021-12-16
      • 1970-01-01
      • 2018-10-20
      • 1970-01-01
      相关资源
      最近更新 更多