Извлечь длительность из символа в R - PullRequest
3 голосов
/ 23 апреля 2020

В настоящее время у меня возникла проблема с набором данных, который мне нужно проанализировать. Вот пример этих данных:

      session_id    individ_id  colony     species           year_tracked
1 12141_2009-07-01 GBT_FP96194 Eynhallow Northern fulmar      2009_10
2 12141_2010-07-18 GBT_FP96235 Eynhallow Northern fulmar      2010_11
3 12143_2009-07-01 GBT_FC14766 Eynhallow Northern fulmar      2009_10
4 12143_2010-07-18 GBT_FR77883 Eynhallow Northern fulmar      2010_12
5 12144_2009-07-01 GBT_FP05030 Eynhallow Northern fulmar      2009_10
6 12145_2009-07-01 GBT_FA82356 Eynhallow Northern fulmar      2009_10

Мне нужно создать новый столбец с количеством отслеживаемых лет, который в этом случае будет:

2010-2009 --> 1
2011-2010 --> 1
2010-2009 --> 1
2012-2010 --> 2
2010-2009 --> 1
2010-2009 --> 1

year_tracked столбец класса character. Возможно, сработает функция, которая берет первые 4 символа ячейки и последние два и преобразует их в дату, но я не знаю, как это сделать.

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

Опция с separate

library(dplyr)
library(tidyr)
library(stringr)
df1 %>% 
    mutate(year_tracked2 = str_replace(year_tracked, "_", "_20")) %>% 
    separate(year_tracked2, into = c('year1', 'year2'), convert = TRUE) %>%
    mutate(n = year2 - year1) %>%
    select(-year1, -year2)
#       session_id  individ_id    colony         species year_tracked n
#1 12141_2009-07-01 GBT_FP96194 Eynhallow Northern fulmar      2009_10 1
#2 12141_2010-07-18 GBT_FP96235 Eynhallow Northern fulmar      2010_11 1
#3 12143_2009-07-01 GBT_FC14766 Eynhallow Northern fulmar      2009_10 1
#4 12143_2010-07-18 GBT_FR77883 Eynhallow Northern fulmar      2010_12 2
#5 12144_2009-07-01 GBT_FP05030 Eynhallow Northern fulmar      2009_10 1
#6 12145_2009-07-01 GBT_FA82356 Eynhallow Northern fulmar      2009_10 1

Или более простой вариант - заменить _ на :20 и просто выполнить eval uation

library(purrr)
df1 %>% 
   mutate(n = lengths(map(str_replace(year_tracked, "_", ":20"),
           ~ eval(parse(text = .x))))- 1)

данные

df1 <- structure(list(session_id = c("12141_2009-07-01", "12141_2010-07-18", 
"12143_2009-07-01", "12143_2010-07-18", "12144_2009-07-01", "12145_2009-07-01"
), individ_id = c("GBT_FP96194", "GBT_FP96235", "GBT_FC14766", 
"GBT_FR77883", "GBT_FP05030", "GBT_FA82356"), colony = c("Eynhallow", 
"Eynhallow", "Eynhallow", "Eynhallow", "Eynhallow", "Eynhallow"
), species = c("Northern fulmar", "Northern fulmar", "Northern fulmar", 
"Northern fulmar", "Northern fulmar", "Northern fulmar"), year_tracked = c("2009_10", 
"2010_11", "2009_10", "2010_12", "2009_10", "2009_10")), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6"))
2 голосов
/ 23 апреля 2020

Здесь с небольшим количеством регулярных выражений: сначала извлеките первый год с четырьмя числами str_extract(.,"[0-9]{4}"), затем извлеките второй год str_extract(.,"(?<=_)[0-9]{2}"), преобразуйте его в формат YYYY, добавив 20, а затем вычтите два

library(magrittr)
library(stringr)

from <- df$year_tracked %>%
  str_extract(.,"[0-9]{4}") %>%
  as.numeric()

to <- df$year_tracked %>%
  str_extract(.,"(?<=_)[0-9]{2}") %>%
  paste0("20",.) %>%
  as.numeric()

result <- to - from

[1] 1 1 1 2 1 1

данные:

df <- read.table(text = "      session_id    individ_id  colony     species           year_tracked
 12141_2009-07-01 GBT_FP96194 Eynhallow Northern fulmar      2009_10
 12141_2010-07-18 GBT_FP96235 Eynhallow Northern fulmar      2010_11
 12143_2009-07-01 GBT_FC14766 Eynhallow Northern fulmar      2009_10
 12143_2010-07-18 GBT_FR77883 Eynhallow Northern fulmar      2010_12
 12144_2009-07-01 GBT_FP05030 Eynhallow Northern fulmar      2009_10
 12145_2009-07-01 GBT_FA82356 Eynhallow Northern fulmar      2009_10",header = T)
...