突变新列包含R中的grepl值。

问题描述 投票:-1回答:1

我的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", .)))
r dplyr rstudio stringr
1个回答
2
投票

如果你只想把日期放在一列中,这也是可行的(假设你每行只有一个日期)。

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

0
投票

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

或者另一种选择是将非Date元素改为 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
© www.soinside.com 2019 - 2024. All rights reserved.