Создайте переменную, которая равна 0 для первого не-NA другой переменной, а затем отсчитывает вверх / вниз от 0 для других значений *, сгруппированных по * третьей переменной - PullRequest
1 голос
/ 12 марта 2019

У меня есть следующее df:

df <- tibble(country = c("US", "US", "US", "US", "US", "US", "US", "US", "US", "Mex", "Mex"),
         year = c(1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2000, 2001),
         score = c(NA, NA, NA, NA, 426, NA, NA, 430, NA, 450, NA))

Что я хотел бы сделать: создать новую переменную years_from_implementation, которая будет 0 первый год, когда страна имеетне-NA значение для score и представляет количество лет от 0 для всех других значений.

Другими словами, жестко закодировав его, я бы хотел вернуть следующееdf:

df <- tibble(country = c("US", "US", "US", "US", "US", "US", "US", "US", "US", "Mex", "Mex"),
         year = c(1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2000, 2001),
         score = c(NA, NA, NA, NA, 426, NA, NA, 430, NA, 450, NA),
         years_from_implementation = c(-4,-3,-2,-1,0,1,2,3,4,0,1))

Это все сделано при группировании по country.

Я попытался соединить df <- mutate(df, before_after = case_when(!is.na(score) ~ 0)) с помощью команды fill, но не смог получить никакого движения.

Решения Tidyverse были бы очень предпочтительны, но действительно любая помощь будет высоко оценена.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Мы можем узнать индекс строки, где появляется первый не-NA score, а затем создать последовательность от 1 - index до n() - index для каждой группы.

library(dplyr)

df %>%
   group_by(country) %>%
   mutate(index = which.max(!is.na(score)), 
          years_from_implementation = (1 - index[1]):(n() - index[1])) %>%
   select(-index)

# country  year score years_from_implementation
#   <chr>   <dbl> <dbl>                     <int>
# 1 US       1999    NA                        -4
# 2 US       2000    NA                        -3
# 3 US       2001    NA                        -2
# 4 US       2002    NA                        -1
# 5 US       2003   426                         0
# 6 US       2004    NA                         1
# 7 US       2005    NA                         2
# 8 US       2006   430                         3
# 9 US       2007    NA                         4
#10 Mex      2000   450                         0
#11 Mex      2001    NA                         1
1 голос
/ 12 марта 2019

Вот вариант dplyr

library(dplyr)
df %>%
    group_by(country) %>%
    mutate(years_from_implementation = 1:n() - which(score == first(score[!is.na(score)]))) %>%
    ungroup()
## A tibble: 11 x 4
#   country  year score years_from_implementation
#   <chr>   <dbl> <dbl>                     <int>
# 1 US       1999    NA                        -4
# 2 US       2000    NA                        -3
# 3 US       2001    NA                        -2
# 4 US       2002    NA                        -1
# 5 US       2003   426                         0
# 6 US       2004    NA                         1
# 7 US       2005    NA                         2
# 8 US       2006   430                         3
# 9 US       2007    NA                         4
#10 Mex      2000   450                         0
#11 Mex      2001    NA                         1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...