столбец mutate содержит значения grepl в R - PullRequest
0 голосов
/ 01 мая 2020

У меня есть 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", .)))

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

В случае, если вам просто нужны даты в одном столбце, это может сработать (при условии, что у вас есть только одна дата в строке):

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 голосов
/ 01 мая 2020

Параметр в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...