Создайте вектор включающих чисел в кадре данных в R - PullRequest
1 голос
/ 29 мая 2019

Воспроизводимые данные:

Start_Curr_Job <- c(2009, 2011, 2014)
End_Curr_Job <- c(2012, 2015, 2019)
data_clean <- data.frame(Start_Curr_Job, End_Curr_Job)

У меня есть фрейм данных со столбцами «startyear» и «endyear». Я пытаюсь создать 3-й столбец, который будет содержать исчерпывающий список всех лет, но мой код ниже не работает.

Например, для начала года = 2009 и конца года = 2012, все годы должны равняться 2009, 2010, 2011, 2012.

Любые предложения будут оценены. Мой код ниже:

data_clean <- data_raw %>%
  filter(!is.na(Start_Curr_Job), !is.na(End_Curr_Job),
         Start_Curr_Job != "NA", End_Curr_Job != "NA" ) %>%
  mutate(Start_Curr_Job = as.numeric(Start_Curr_Job),
         End_Curr_Job = as.numeric(End_Curr_Job)) %>%
mutate(all_years = seq(from = Start_Curr_Job, to = End_Curr_Job, by = 1))

Сообщение об ошибке: «Ошибка в seq.default (от = Start_Curr_Job, до = End_Curr_Job, от = 1): 'from' должен иметь длину 1 "

Я также попробовал следующее, но он выдал allyears = "2019: 2012", что тоже не то, что я хочу.

  for (row in 1:nrow(data_clean)) {
    data_clean$years[row] <- list(data_clean$Start_Curr_Job[row]:data_clean$End_Curr_Job[row])
  }

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Вы можете использовать apply() с paste() и seq() от базы R -

data_clean$years <- apply(data_clean, 1, function(x) paste(seq(x[1], x[2]), collapse = ", "))

  Start_Curr_Job End_Curr_Job                              years
1           2009         2012             2009, 2010, 2011, 2012
2           2011         2015       2011, 2012, 2013, 2014, 2015
3           2014         2019 2014, 2015, 2016, 2017, 2018, 2019
0 голосов
/ 29 мая 2019

Проблема в том, что seq не векторизован, поэтому он не может принимать вектор в качестве аргументов. Есть еще один пост, в котором рассказывается, как векторизовать функцию здесь .

В противном случае другой подход заключается в использовании функций map2_ из пакета purrr. Представляем ниже

library(tidyverse)
library(purrr)

Start_Curr_Job <- c(2009, 2011, 2014)
End_Curr_Job <- c(2012, 2015, 2019)
data_raw <- data.frame(Start_Curr_Job, End_Curr_Job)

data_clean <- data_raw %>%
  filter(!is.na(Start_Curr_Job), !is.na(End_Curr_Job),
         Start_Curr_Job != "NA", End_Curr_Job != "NA" ) %>%
  mutate(Start_Curr_Job = as.numeric(Start_Curr_Job),
         End_Curr_Job = as.numeric(End_Curr_Job)) %>% 
  mutate(all_years =  purrr::map2_chr(.x = Start_Curr_Job, .y = End_Curr_Job, .f = ~paste(seq(.x, .y), collapse = ", ")))

data_clean
#>   Start_Curr_Job End_Curr_Job                          all_years
#> 1           2009         2012             2009, 2010, 2011, 2012
#> 2           2011         2015       2011, 2012, 2013, 2014, 2015
#> 3           2014         2019 2014, 2015, 2016, 2017, 2018, 2019

Создано в 2019-05-29 пакетом представ. (v0.2.1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...