Как создать условные манекены "до события" с помощью dplyr в R? - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь создать условный манекен (X) с правилом

, установите X = 1, если Y = 1 за последние два года до NA (считайте только один раз!).

Чтобы привести пример: это пример из моих данных:

year    country Y
1990    Bahamas 1
1991    Bahamas NA
1992    Bahamas NA
1993    Bahamas 0
1994    Bahamas 1
1995    Bahamas 1
1996    Bahamas NA
1997    Bahamas 1
1998    Bahamas NA
1999    Bahamas 1
2000    Bahamas NA
2001    Bahamas 1
2002    Bahamas 1
2003    Bahamas 0
2004    Bahamas NA
2005    Bahamas 0
2006    Bahamas 0
2007    Bahamas 1
2008    Bahamas NA
2009    Bahamas 1
2010    Bahamas 1
2011    Bahamas 1

А вот как должен выглядеть манекен X:

year    country Y   X1
1990    Bahamas 1   1
1991    Bahamas NA  0
1992    Bahamas NA  0
1993    Bahamas 0   0
1994    Bahamas 1   1
1995    Bahamas 1   0
1996    Bahamas NA  0
1997    Bahamas 1   1
1998    Bahamas NA  0
1999    Bahamas 1   1
2000    Bahamas NA  0
2001    Bahamas 1   1
2002    Bahamas 1   0
2003    Bahamas 0   0
2004    Bahamas NA  0
2005    Bahamas 0   0
2006    Bahamas 0   0
2007    Bahamas 1   1
2008    Bahamas NA  0
2009    Bahamas 1   0
2010    Bahamas 1   0
2011    Bahamas 1   0

Этослишком сложно для меня.Я читал о dplyr, который, кажется, здесь уместен.Мои показания до сих пор приводили меня к этой кодировке

df %>% mutate(X=ifelse(Y >0) & lag(Y,2,))

Я получаю ошибку:

аргумент "да" отсутствует, без значения по умолчанию

Пожалуйста, скажите мне, что я здесь не так делаю.Должен ли я поставить "ifelse" перед "лагом"?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Решение можно найти с помощью пакета dplyr.Подход состоит в том, чтобы создать группу, заканчивающуюся NA.Тогда строка first для группы, имеющей Y == 1 и last Y этой группы, равна NA, тогда x1 устанавливается как 1, в противном случае X1 будет устанавливаться как 0.

library(dplyr)

df %>% group_by(Grp = cumsum(is.na(lag(Y))))  %>%
  mutate(X1 = ifelse(row_number()== min(which(Y==1)) & is.na(last(Y)) , 1, 0 )) %>%
  ungroup() %>%
  select(-Grp) %>%
  as.data.frame()


#    year country  Y X1
# 1  1990 Bahamas  1  1
# 2  1991 Bahamas NA  0
# 3  1992 Bahamas NA  0
# 4  1993 Bahamas  0  0
# 5  1994 Bahamas  1  1
# 6  1995 Bahamas  1  0
# 7  1996 Bahamas NA  0
# 8  1997 Bahamas  1  1
# 9  1998 Bahamas NA  0
# 10 1999 Bahamas  1  1
# 11 2000 Bahamas NA  0
# 12 2001 Bahamas  1  1
# 13 2002 Bahamas  1  0
# 14 2003 Bahamas  0  0
# 15 2004 Bahamas NA  0
# 16 2005 Bahamas  0  0
# 17 2006 Bahamas  0  0
# 18 2007 Bahamas  1  1
# 19 2008 Bahamas NA  0
# 20 2009 Bahamas  1  0
# 21 2010 Bahamas  1  0
# 22 2011 Bahamas  1  0
# 
# 

Данные:

df <- read.table(text = 
"year    country Y
1990    Bahamas 1
1991    Bahamas NA
1992    Bahamas NA
1993    Bahamas 0
1994    Bahamas 1
1995    Bahamas 1
1996    Bahamas NA
1997    Bahamas 1
1998    Bahamas NA
1999    Bahamas 1
2000    Bahamas NA
2001    Bahamas 1
2002    Bahamas 1
2003    Bahamas 0
2004    Bahamas NA
2005    Bahamas 0
2006    Bahamas 0
2007    Bahamas 1
2008    Bahamas NA
2009    Bahamas 1
2010    Bahamas 1
2011    Bahamas 1",
header = TRUE, stringsAsFactors = FALSE)
0 голосов
/ 28 мая 2018
library(dplyr)

dat <- readr::read_table(
"year    country Y
1990    Bahamas 1
1991    Bahamas NA
1992    Bahamas NA
1993    Bahamas 0
1994    Bahamas 1
1995    Bahamas 1
1996    Bahamas NA
1997    Bahamas 1
1998    Bahamas NA
1999    Bahamas 1
2000    Bahamas NA
2001    Bahamas 1
2002    Bahamas 1
2003    Bahamas 0
2004    Bahamas NA
2005    Bahamas 0
2006    Bahamas 0
2007    Bahamas 1
2008    Bahamas NA
2009    Bahamas 1
2010    Bahamas 1
2011    Bahamas 1
")

expected_output <- readr::read_table(
"year    country Y   X1
1990    Bahamas 1   1
1991    Bahamas NA  0
1992    Bahamas NA  0
1993    Bahamas 0   0
1994    Bahamas 1   1
1995    Bahamas 1   0
1996    Bahamas NA  0
1997    Bahamas 1   1
1998    Bahamas NA  0
1999    Bahamas 1   1
2000    Bahamas NA  0
2001    Bahamas 1   1
2002    Bahamas 1   0
2003    Bahamas 0   0
2004    Bahamas NA  0
2005    Bahamas 0   0
2006    Bahamas 0   0
2007    Bahamas 1   1
2008    Bahamas NA  0
2009    Bahamas 1   0
2010    Bahamas 1   0
2011    Bahamas 1   0
")

Определите группы, заканчивающиеся NA, найдите позицию первого 1 в столбце Y, создайте столбец X1 с 1 s в найденных позициях:

res <-
  dat %>% 
  group_by(country) %>% 
  group_by(grp = cumsum(is.na(lag(Y))), add = TRUE) %>% 
  mutate(first_year_at_1 = match(1, Y) * any(is.na(Y)) * any(tail(Y, 3) == 1L), 
         X1 = {x <- integer(length(Y)) ; x[first_year_at_1] <- 1L ; x}) %>% 
  ungroup()

all.equal(select(res, -grp, -first_year_at_1), expected_output)

# [1] TRUE

(Примечание: если в реальном наборе данных есть разные страны, вы можете сначала сгруппировать по country, чтобы избежать нежелательных эффектов на стыке стран. Я соответственно отредактировал свой ответ).

...