Создайте столбцы на основе нескольких других столбцов в R

#r #dplyr

Вопрос:

Я пытаюсь создать несколько других столбцов на основе трех столбцов в моих данных ( Company , Name , и Year ).

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

Number_Years: Количество лет, в течение которых человек работал в компании. 7years_Span: Количество лет, в течение которых человек работал в компании за последние 7 лет (начиная с текущего года). Continuous_Years: Количество непрерывных лет, в течение которых человек работал в компании. Years_Gap: Количество лет между тем, когда Человек в последний раз работал в компании, и тем, когда он снова присоединился к компании.

На основе столбцов Company Name и Year : Я хочу создать другие столбцы , как определено выше

Компания Имя Год Количество лет 7лет_прОлет непрерывные_лет лет_гап
азбука Джон 2002 7 1 3 0
азбука Джон 2003 7 2 3 0
азбука Джон 2004 7 3 3 0
азбука Дейв 2005 2 1 1 0
азбука Джон 2006 7 4 1 1
азбука Дейв 2007 2 2 1 1
азбука Джон 2008 7 5 2 1
азбука Джон 2009 7 5 2 0
Би-би-си Джим 2010 1 1 1 0
азбука Джим 2010 2 1 2 0
Би-би-си Дейв 2011 1 1 1 0
ВВВ Джон 2011 1 1 1 0
азбука Джим 2011 2 2 2 0
азбука Джон 2012 7 4 1 2

Я пытался создать эти столбцы, но до сих пор у меня ничего не получилось, и я безуспешно искал на StackOverflow и других платформах. Буду признателен, если кто-нибудь сможет помочь. Я надеюсь, что привел простой пример с достаточным количеством информации.

Пример ввода данных:

 structure(list(Company = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 3L, 1L, 3L, 2L, 1L, 1L), .Label = c("ABC", "BBB", "BBC"
), class = "factor"), Name = structure(c(3L, 3L, 3L, 1L, 3L, 
1L, 3L, 3L, 2L, 2L, 1L, 3L, 2L, 3L), .Label = c("Dave", "Jim", 
"John"), class = "factor"), Year = c(2002L, 2003L, 2004L, 2005L, 
2006L, 2007L, 2008L, 2009L, 2010L, 2010L, 2011L, 2011L, 2011L, 
2012L), Number_Years = c(7L, 7L, 7L, 2L, 7L, 2L, 7L, 7L, 1L, 
2L, 1L, 1L, 2L, 7L), `7years_span` = c(1L, 2L, 3L, 1L, 4L, 2L, 
5L, 5L, 1L, 1L, 1L, 1L, 2L, 4L), Continuous_Years = c(3L, 3L, 
3L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L), Years_Gap = c(0L, 
0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 2L)), class = "data.frame", row.names = c(NA, 
-14L))
 

Комментарии:

1. Пожалуйста, предоставьте код для вашего фрейма данных. Вы можете использовать dput(dataframe)

2. Что вы подразумеваете под «текущим годом»? В прошлом году? 2021?

3. «Years_Gap: Количество лет между последним разом, когда человек работал с компанией».. между последним разом, когда человек работал с компанией, И ЧЕМ?

4. @GuedesBF Спасибо за ваше внимание. Под «текущим годом» я имею в виду, если он рассчитывается, скажем, с 2004 года, то рассмотрим предыдущие 7 лет, начиная с 2004 года и в обратном направлении, в отличие от 2003 года и в обратном направлении. Для второго уточнения укажите количество лет с момента, когда человек в последний раз работал в компании, а затем снова присоединился к компании, чтобы работать с ними. Таким образом, в основном разрыв с момента последней работы в компании, а затем повторного присоединения.

5. почему ABC John для 2008 и 2009 continuous years 1 годов это так ? Разве это не должно быть 2?

Ответ №1:

Отредактированный

 df <- structure(list(Company = c("ABC", "ABC", "ABC", "ABC", "ABC", 
                                 "ABC", "ABC", "ABC", "BBC", "ABC", "BBC", "BBB", "ABC", "ABC"
), Name = c("John", "John", "John", "Dave", "John", "Dave", "John", 
            "John", "Jim", "Jim", "Dave", "John", "Jim", "John"), Year = c(2002L, 
                                                                           2003L, 2004L, 2005L, 2006L, 2007L, 2008L, 2009L, 2010L, 2010L, 
                                                                           2011L, 2011L, 2011L, 2012L)), row.names = c(NA, -14L), class = "data.frame")
df
#>    Company Name Year
#> 1      ABC John 2002
#> 2      ABC John 2003
#> 3      ABC John 2004
#> 4      ABC Dave 2005
#> 5      ABC John 2006
#> 6      ABC Dave 2007
#> 7      ABC John 2008
#> 8      ABC John 2009
#> 9      BBC  Jim 2010
#> 10     ABC  Jim 2010
#> 11     BBC Dave 2011
#> 12     BBB John 2011
#> 13     ABC  Jim 2011
#> 14     ABC John 2012
library(runner)
library(dplyr)

df %>%
  group_by(Company, Name) %>%
  mutate(Number_years = n(),
         X7Years_span = runner(x = Year,
                               k = 7,
                               idx = Year,
                               f = function(x) length(x)),
         Continous_years = cumsum(c(0, diff(Year)) != 1),
         Years_gap = Year - lag(Year, default = first(Year) -1) -1) %>%
  group_by(Continous_years, .add = T) %>%
  mutate(Continous_years = n()) %>%
  ungroup()
#> # A tibble: 14 x 7
#>    Company Name   Year Number_years X7Years_span Continous_years Years_gap
#>    <chr>   <chr> <int>        <int>        <int>           <int>     <dbl>
#>  1 ABC     John   2002            7            1               3         0
#>  2 ABC     John   2003            7            2               3         0
#>  3 ABC     John   2004            7            3               3         0
#>  4 ABC     Dave   2005            2            1               1         0
#>  5 ABC     John   2006            7            4               1         1
#>  6 ABC     Dave   2007            2            2               1         1
#>  7 ABC     John   2008            7            5               2         1
#>  8 ABC     John   2009            7            5               2         0
#>  9 BBC     Jim    2010            1            1               1         0
#> 10 ABC     Jim    2010            2            1               2         0
#> 11 BBC     Dave   2011            1            1               1         0
#> 12 BBB     John   2011            1            1               1         0
#> 13 ABC     Jim    2011            2            2               2         0
#> 14 ABC     John   2012            7            4               1         2
 

Создано 2021-05-25 пакетом reprex (v2.0.0)

Комментарии:

1. Гораздо лучше, чем мой ответ. Хорошая работа.

2. Мне не ясен continuous year расчет

3. Да, это все еще нуждается в некоторых разъяснениях со стороны ОП. Я думаю, вам может понадобиться что-то вроде max() здесь, но вы не совсем уверены, как группироваться по всем «полосам». .....Continous_years = max(streak_run(Continous_years))....

4. Спасибо @AnilGoyal, это очень полезно! @GuedesBF, я попробую использовать подход max continuous year . Хорошего вам обоим дня!

5. @FurqanShah, смотрите отредактированный ответ. Теперь он точно соответствует ожидаемому результату