Вернуть две последовательные строки с разными условиями для удовлетворения - PullRequest
2 голосов
/ 03 апреля 2019

Итак, у меня есть данные, которые я хочу выбрать последовательные строки, в которых первая строка должна соответствовать условию 1, а следующая следует за ним также должны соответствовать другим условиям.

Предположим, у меня есть матрица A, я хочу выбрать строки, в которых столбец 1 равен 0, а столбец 2 находится в (24, 25), а последующая строка должна быть 1 для первого столбца.Таким образом, в моих данных ниже только строка (2,3) и строка (5,6) будут выбраны вместе.строка 4 удовлетворяет условию 1, но не имеет следующих строк, поэтому она покинула.

A <- structure(c(0, 0, 1, 0, 0, 1, 22, 24, 1, 24, 25, 3), .Dim = c(6L,2L)) 

Я ожидаю вывода

 B <- structure(c(0, 1, 0, 1, 24, 1, 25, 3), .Dim = c(4L, 2L)) 

Я не нашел хорошего способа решить эту проблему, надеюсь, кто-нибудь может дать некоторые предложения.Большое спасибо

Ответы [ 2 ]

3 голосов
/ 03 апреля 2019

Попробуйте это:

ind <- A[,1] == 0 & A[,2] %in% c(24, 25) & c(A[-1,1] == 1, FALSE)
ind
# [1] FALSE  TRUE FALSE FALSE  TRUE FALSE
A[ind,]
#      [,1] [,2]
# [1,]    0   24
# [2,]    0   25
A[ind | c(FALSE, ind[-nrow(A)]), ]
#      [,1] [,2]
# [1,]    0   24
# [2,]    1    1
# [3,]    0   25
# [4,]    1    3

С другой стороны,

A[sort(c(which(ind), which(ind) + 1)),]
#      [,1] [,2]
# [1,]    0   24
# [2,]    1    1
# [3,]    0   25
# [4,]    1    3
3 голосов
/ 03 апреля 2019

Сначала мы можем найти индексы, где столбец 1 равен 0, а столбец 2 - c(24, 25), найти следующие строки, где столбец 1 равен 1, и отфильтровать эти строки.

inds <- which(A[, 1] == 0 & A[, 2] %in% c(24, 25))
inds1 <- A[inds + 1, 1] == 1

A[sort(c(inds[inds1], (inds + 1)[inds1])), ]

#     [,1] [,2]
#[1,]    0   24
#[2,]    1    1
#[3,]    0   25
#[4,]    1    3

Подход с использованием dplyr, lead и slice

library(dplyr)

data.frame(A) %>%
      slice({
         inds = which(X1 == 0 & X2 %in% c(24, 25) & lead(X1) == 1)
         sort(c(inds, inds + 1))
        })

#  X1 X2
#1  0 24
#2  1  1
#3  0 25
#4  1  3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...