Как извлечь предыдущие n строк, где определенное значение столбца не может быть определенным значением? - PullRequest
1 голос
/ 24 мая 2019

Я уже довольно долго ищу безуспешно.По сути, я пытаюсь найти способ в R извлечь предыдущие n строк, где «Столбец LTO» равен 0, но начиная с того, где «Столбец LTO» равен 1.

Таблица данных:

Week          Price           LTO     
1/1/2019        11              0    
2/1/2019        12              0
3/1/2019        11              0
4/1/2019        11              0
5/1/2019        9.5             1
6/1/2019        10              0
7/1/2019         8              1

Тогда я пытаюсь сказать, что если n = 3, начиная с 01.05.2009, где LTO = 1. Я хочу иметь возможность вытягивать строки 04.01.2017, 01.03.2009.2/1 / 2019.

Но тогда для 01.07.2009, где LTO также равен 1, я хочу захватить строки 01.06.2009, 01.04.2009, 3/1/ 2019.В этой ситуации он пропускает строку 01.05.2009, потому что в столбце LTO есть 1.

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 24 мая 2019

Может быть лучший способ сделать это, вот одна попытка с использованием базы R.

#Number of rows to look back
n <- 3

#Find row index where LTO is 1.
inds <- which(df$LTO == 1) 

#Remove row index where LTO is 1
remaining_rows <- setdiff(seq_len(nrow(df)), inds)

#For every inds find the previous n rows from remaining_rows 
#use it to subset from the dataframe and add a new column week2
#with its corresponding date
do.call(rbind, lapply(inds, function(x) {
   o <- match(x - 1, remaining_rows)
   transform(df[remaining_rows[o:(o - (n -1))], ], week2 = df$Week[x])
})) 

#      Week Price LTO    week2
#4  4/1/2019    11   0 5/1/2019
#3  3/1/2019    11   0 5/1/2019
#2  2/1/2019    12   0 5/1/2019
#6  6/1/2019    10   0 7/1/2019
#41 4/1/2019    11   0 7/1/2019
#31 3/1/2019    11   0 7/1/2019

Данные

df <- structure(list(Week = structure(1:7, .Label = c("1/1/2019", 
"2/1/2019", "3/1/2019", "4/1/2019", "5/1/2019", "6/1/2019", "7/1/2019"), class = 
"factor"), Price = c(11, 12, 11, 11, 9.5, 10, 8), LTO = c(0L, 0L, 0L, 
0L, 1L, 0L, 1L)), class = "data.frame", row.names = c(NA, -7L))
...