Найти и извлечь год в предложении для каждой ячейки в R - PullRequest
0 голосов
/ 01 декабря 2018

У меня большой кадр данных 22641 шт.и 12 переменных.Первый столбец "year" включает извлеченные значения из спутниковых изображений в формате ниже.

1_1_1_1_LT05_127024_19870517_00005ff8aac6b6bf60bc

Из этого формата я хочу сохранить только дату, которая в данном случае равна 19870517, и отформатировать ее как дату (две разные вещи).Обычно я использую regex для извлечения нужных мне слов, но здесь дата отличается для каждой ячейки, и я не знаю, как заменить вышеуказанный текст только датой.Может быть, способ сделать это - поиск по позиции в предложении, но я не знаю как.

Есть идеи?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 01 декабря 2018

Непонятно, что означает «дата различна в каждой ячейке», но если это означает, что значение даты отличается, и это всегда седьмое поле, то сработает любой из (1) или (2).Если это означает, что он состоит из 8 последовательных цифр в любом месте текста или 8 последовательных цифр, заключенных в любом месте в тексте _, см. (3).

1) Предполагая ввод DF, показанный в воспроизводимой форме в примечании, в конце используйте read.table, чтобы прочитать year, выделите седьмое поле и затем преобразовайте его в класс Date.Пакеты не используются.

transform(read.table(text = DF$year, sep = "_")[7],
  year = as.Date(as.character(V7), "%Y%m%d"), V7 = NULL)
##         year
## 1 1987-05-17

2) Другая альтернатива - separate в тидыре.Требуется 0.8.2 или более поздняя версия.

library(dplyr)
library(tidyr)

DF %>%
  separate(year, c(rep(NA, 6), "year"), extra = "drop") %>%
  mutate(year = as.Date(as.character(year), "%Y%m%d"))

##         year
## 1 1987-05-17

3) Предполагается, что дата является единственной последовательностью из 8 цифр в поле year, используйте ее или, если мы ее знаемокружен символом _, тогда вместо него можно использовать регулярное выражение "_(\\d{8})_".

library(gsubfn)

transform(DF, 
  year = do.call("c", strapply(DF$year, "\\d{8}", ~ as.Date(x, "%Y%m%d"))))

##         year
## 1 1987-05-17

Примечание

DF <- data.frame(year = "1_1_1_1_LT05_127024_19870517_00005ff8aac6b6bf60bc",
 stringsAsFactors = FALSE)
0 голосов
/ 01 декабря 2018

Вы можете использовать sub для извлечения строки данных и as.Date для преобразования ее в формат даты R:

 as.Date(sub(".+?([0-9]+)_[^_]+$", "\\1", txt), "%Y%m%d")
 # [1] "1987-05-17"

, где txt <- "1_1_1_1_LT05_127024_19870517_00005ff8aac6b6bf60bc"

0 голосов
/ 01 декабря 2018

Не уверен, будет ли это обобщать все ваши данные, но возможно:

gsub(
    '(^(?:.*?[^0-9])?)(\\d{8})((?:[^0-9].*)?$)', 
    '\\2', 
    '1_1_1_1_LT05_127024_19870517_00005ff8aac6b6bf60bc', 
    perl = TRUE
)

## [1] "19870517"

При этом используется групповой захват и выбрасывается все, кроме ограниченных 8-значных строк.

...