【问题标题】:mutate new column contains grepl values in R变异新列包含 R 中的 grepl 值
【发布时间】:2020-05-01 14:34:11
【问题描述】:

我有这样的data.table:

data <- data.frame(a = c(NA, "2019-08-02", NA, "243", "N"),
                b = c(NA, NA, "2", "2019-02-01", "MA"),
                c = c("2019-12-02", NA, "2019-11-22", NA, "2019-01-30"))

我需要的值包含在不同的行和列中。那么,我想要什么? 我需要创建新列,而不是包含我需要的值:

1 2019-08-02 NA NA 242
2 2019-02-01 M 342 NA
3 2019-02-01 M 342 NA
4 2019-02-01 M 342 NA
5 2019-02-01 M 342 NA

我尝试使用mutate_all,但是这个函数不能用于简单的变异!

data1 <- data %>% 
   mutate(new = mutate_all(., ~grepl("2019", .)))

【问题讨论】:

  • 你能澄清一下想要的输出是什么吗?原始数据中没有242,只有一个243。您可以轻松地将所有日期放在一列中。我不确定您想对其余数据做什么。
  • 我有 3k 行 20 列的凌乱数据集)所以,手动工作不是很好)
  • 手工工作永远不好,我从没提过。您只需要一列中的日期吗?请直接在您的问题中回答。我认为您想要的输出是什么并不太清楚。在您的示例中,所有 342 来自哪里?

标签: r dplyr stringr


【解决方案1】:

如果您只想要一列中的日期,这可以工作(假设您每行只有一个日期):

library(stringr)
f <- apply(data, 1, function(x) paste(x, collapse = " "))
data$new <- str_extract(f, "\\d{4}-\\d{2}-\\d{2}")

data
           a          b          c        new
1       <NA>       <NA> 2019-12-02 2019-12-02
2 2019-08-02       <NA>       <NA> 2019-08-02
3       <NA>          2 2019-11-22 2019-11-22
4        243 2019-02-01       <NA> 2019-02-01
5          N         MA 2019-01-30 2019-01-30

【讨论】:

    【解决方案2】:

    tidyverse 中的一个选项是重塑为“长”格式,filter 具有Date 格式的行并将列绑定到原始数​​据集

    library(dplyr)
    library(tidyr)
    library(stringr)
    data %>% 
        pivot_longer(cols = everything(), values_drop_na = TRUE, values_to = 'new')  %>% 
        select(new) %>% 
        filter(str_detect(new, "^\\d{4}-\\d{2}-\\d{2}$")) %>%
        bind_cols(data, .)
    # A tibble: 5 x 4
    #  a          b          c          new       
    #  <fct>      <fct>      <fct>      <fct>     
    #1 <NA>       <NA>       2019-12-02 2019-12-02
    #2 2019-08-02 <NA>       <NA>       2019-08-02
    #3 <NA>       2          2019-11-22 2019-11-22
    #4 243        2019-02-01 <NA>       2019-02-01
    #5 N          MA         2019-01-30 2019-01-30
    

    或者另一种选择是将非日期元素更改为NA 并使用coalesce

    data %>% 
         mutate_all(~ as.character(replace(., !str_detect(., '^\\d{4}-\\d{2}-\\d{2}$'), NA))) %>%
         transmute(new  = coalesce(!!! .)) %>%
         bind_cols(data, .)
    #           a          b          c        new
    #1       <NA>       <NA> 2019-12-02 2019-12-02
    #2 2019-08-02       <NA>       <NA> 2019-08-02
    #3       <NA>          2 2019-11-22 2019-11-22
    #4        243 2019-02-01       <NA> 2019-02-01
    #5          N         MA 2019-01-30 2019-01-30
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-25
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 2019-02-24
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      相关资源
      最近更新 更多