Создайте новую переменную, равную 0 до первого не-NA значения другой переменной, а затем 1 (в группе) - PullRequest
1 голос
/ 10 марта 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))

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

Другими словами, жестко закодировав его, я бы хотел, чтобы он возвратил следующий 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),
         before_after = c(0,0,0,0,1,1,1,1,1,1,1))

Я попробовал следующий код, но безрезультатно:

df %>% 
arrange(year) %>% 
group_by(country) %>% 
mutate(before_after = ifelse(which.max(!is.na(score)),1,0)) %>% 
arrange(country, year)

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

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

Ответы [ 2 ]

2 голосов
/ 10 марта 2019

Вы можете использовать cumsum

df %>%
  arrange(country, year) %>%
  group_by(country) %>%
  mutate(before_after = ifelse(cumsum(!is.na(score)) > 0, 1, 0)) 

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

Используйте group_by в сочетании с fill:

library(tidyverse)

# create dataframe
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))

# create before_after variable with case_when
(df <- mutate(df, before_after = case_when(!is.na(score) ~ 1)))
# A tibble: 11 x 4
   country  year score before_after
   <chr>   <dbl> <dbl>        <dbl>
 1 Mex      2000   450            1
 2 Mex      2001    NA           NA
 3 US       1999    NA           NA
 4 US       2000    NA           NA
 5 US       2001    NA           NA

# run fill
df %>%
  group_by(country) %>%
  fill(before_after)
# A tibble: 11 x 4
# Groups:   country [2]
   country  year score before_after
   <chr>   <dbl> <dbl>        <dbl>
 1 Mex      2000   450            1
 2 Mex      2001    NA            1
 3 US       1999    NA           NA
 4 US       2000    NA           NA
 5 US       2001    NA           NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...