ведение ряда, соответствующего одному критерию, и ряда над ним, если он соответствует другому - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть набор данных, похожий, но гораздо более длинный и сложный, чем следующий:

df<-data.frame(ID = c(1,1,2,2,3,3,3), 
               week = c(20,21,10,15,20,21,22), 
               var1 = c(0,1,0,1,0,0,1))

  ID week var1
1  1   20    0
2  1   21    1
3  2   10    0
4  2   15    1
5  3   20    0
6  3   21    0
7  3   22    1

Я хотел бы создать новый фрейм данных, который хранит все строки, где var1 = 1, и сохраняетпредыдущая строка, если идентификатор совпадает, а неделя ровно на одну единицу меньше, чем включенная строка.Новый фрейм данных будет выглядеть так:

  ID week var1
1  1   20    0
2  1   21    1
3  2   15    1
4  3   21    0
5  3   22    1

Я пытался установить подмножество

df1<-df[which(df$var1 == 1) - 1, ]

, но это дает мне предыдущий ряд, соответствует ли он моим критериям или нет.

Я также пробовал отставать в dplyr

df2<-filter(df, var1==1 & lag(week)==week-1)

, но это дает мне только те строки, которые соответствуют обоим критериям.Весь код, который я искал, приводит к тому или иному из этих результатов.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Используя SQL, мы имеем:

library(sqldf)

sqldf("select b.* from df a join df b on a.ID = b.ID and b.week = a.week - 1
       where a.var1 = 1
       union
       select * from df 
       where var1 = 1
       order by ID, week")

, дающий

  ID week var1
1  1   20    0
2  1   21    1
3  2   15    1
4  3   21    0
5  3   22    1
0 голосов
/ 19 сентября 2018

Вы можете иметь дело с каждым условием последовательно:

Для вашего фрейма данных:

df<-data.frame(ID = c(1,1,2,2,3,3,3), 
               week = c(20,21,10,15,20,21,22), 
               var1 = c(0,1,0,1,0,0,1))

Требуется выбрать следующее

#   ID week var1
# 1  1   20    0 # <- condition 2 + condition 3
# 2  1   21    1 # <- condition 1
# 3  2   10    0 # <- condition 2
# 4  2   15    1 # <- condition 1
# 5  3   20    0 #
# 6  3   21    0 # <- condition 2 + condition 3
# 7  3   22    1 # <- condition 1

И выбрать только строкис условием 1 и условием 2 + 3:

## Condition 1: Selecting the rows with var1 = 1
rows_var1 <- which(df$var1 == 1)
rows_var1
# [1] 2 4 7

## Condition 2: Selecting all the previous rows with the same ID
same_ID <- (rows_var1 - 1)[(df$ID[rows_var1] == df$ID[rows_var1 - 1])]
same_ID
# [1] 1 3 6

## Condition 3: Selecting the same IDs with that equal to week-1
same_ID_week <- same_ID[df$week[same_ID] == (df$week[rows_var1] - 1)]
same_ID_week
# [1] 1 6

## Getting the table subset
df1 <- df[sort(c(rows_var1, same_ID_week)),]

#   ID week var1
# 1  1   20    0
# 2  1   21    1
# 3  2   15    1
# 4  3   21    0
# 5  3   22    1
...