извлечение новейшей даты из столбца с несколькими датами в каждой ячейке - PullRequest
0 голосов
/ 25 октября 2018

У меня есть следующий фиктивный фрейм данных:

structure(list(id = 1:10, dates = c("2018-07-02, 2018-06-28", 
"2018-08-22", "2018-08-06, 2018-07-31", "2018-03-08", "2018-02-22, 2018-02-19", 
"2018-07-04, 2018-07-06", "2018-06-26, 2018-06-22", "2018-01-18, 2018-01-24", 
"2018-06-05, 2018-06-14", "2018-01-18")), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -10L))

Я хочу преобразовать все записи в столбце «даты» в дату, затем выбрать самую новую и удалить все другие даты в этой ячейке.

Я пробовал следующее:

library(dplyr)
library(reprex)
library(purrr)
library(lubridate)

test_df %>%
    mutate(dates = dates %>%
            str_extract_all("[0-9]+-[0-9]+-[0-9]+") %>%
            map(ymd) %>%
            map_lgl(~ any(max(.))))

Но каким-то образом это преобразует все записи в каждой ячейке в число вместо правильных дат.

Что я хочу получить в итогес:

id dates
1 2018-07-02
2 2018-08-22            
3 2018-08-06
4 2018-03-08            
5 2018-02-22
6 2018-07-06
7 2018-06-26
8 2018-01-24
9 2018-06-14
10 2018-01-18

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Вы можете попробовать:

library(tidyverse)
df %>% mutate(dates = str_split(dates, ", ") %>%
                map(sort, decreasing = TRUE) %>%
                map_chr(1) %>%
                as.Date)

# A tibble: 10 x 2
      id dates     
   <int> <date>    
 1     1 2018-07-02
 2     2 2018-08-22
 3     3 2018-08-06
 4     4 2018-03-08
 5     5 2018-02-22
 6     6 2018-07-06
 7     7 2018-06-26
 8     8 2018-01-24
 9     9 2018-06-14
10    10 2018-01-18
0 голосов
/ 25 октября 2018

Я использую три мутации:

  1. разделяет строки запятыми
  2. преобразует строки в даты
  3. сохраняет только самую новую дату

Тогда вот оно:

df <- structure(list(id = 1:10, dates = c("2018-07-02, 2018-06-28", 
                                    "2018-08-22", "2018-08-06, 2018-07-31", "2018-03-08", "2018-02-22, 2018-02-19", 
                                    "2018-07-04, 2018-07-06", "2018-06-26, 2018-06-22", "2018-01-18, 2018-01-24", 
                                    "2018-06-05, 2018-06-14", "2018-01-18")), class = c("tbl_df", 
                                                                                        "tbl", "data.frame"), row.names = c(NA, -10L))

library(tidyr)
library(stringi)
library(dplyr)

df_new <- df %>% 
  mutate(dates = stri_split_fixed(dates, ", ")) %>% 
  mutate(dates = rapply(dates, as.Date, how = "list")) %>% 
  mutate(dates = lapply(dates, function(x) {
    sort(x, decreasing = TRUE)[1]
  })) %>% 
  unnest(dates)

> df_new
# A tibble: 10 x 2
      id dates     
   <int> <date>    
 1     1 2018-07-02
 2     2 2018-08-22
 3     3 2018-08-06
 4     4 2018-03-08
 5     5 2018-02-22
 6     6 2018-07-06
 7     7 2018-06-26
 8     8 2018-01-24
 9     9 2018-06-14
10    10 2018-01-18

Еще один вариант с картой вместо двух apply s:

library(tidyr)
library(stringi)
library(dplyr)
library(purrr)

df_new <- df %>% 
  mutate(dates = stri_split_fixed(dates, ", ")) %>% 
  mutate(dates = map(dates, function(x) {
    x <- as.Date(x)
    sort(x, decreasing = TRUE)[1]
  })) %>%
  unnest(dates)

df_new
0 голосов
/ 25 октября 2018

scan в полях, возьмите наибольшее и преобразовать в Date класс.

library(dplyr)

scan_max <- function(x) {
  max(scan(text = x, what = "", sep = ",", quiet = TRUE, strip.white = TRUE))
}
test_df %>%
  mutate(dates = as.Date(sapply(dates, scan_max)))

, что дает:

# A tibble: 10 x 2
      id dates     
   <int> <date>    
 1     1 2018-07-02
 2     2 2018-08-22
 3     3 2018-08-06
 4     4 2018-03-08
 5     5 2018-02-22
 6     6 2018-07-06
 7     7 2018-06-26
 8     8 2018-01-24
 9     9 2018-06-14
10    10 2018-01-18

Это также можно записать так:

scan_max <- . %>% 
  scan(text = ., what = "", sep = ",", quiet = TRUE, strip.white = TRUE) %>%
  max

test_df %>%
  mutate(dates = dates %>% sapply(scan_max) %>% as.Date)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...