разделить вектор после того, как все предопределенное множество элементов произошло - PullRequest
2 голосов
/ 01 апреля 2020

Я должен сделать следующее:

У меня есть вектор, скажем, как

x  <- c(1, 1, 2, 3, 3, 3, 4, 4, 5, 5, 3, 2, 11, 1, 3, 3, 4, 1)

Я должен установить подмножество вектора после того, как 1, 2, 3, 4 произошло хотя бы один раз , Таким образом, подмножество нового вектора будет включать только 4, 5, 5, 3, 2, 11, 1, 3, 3, 4, 1.

. Мне нужно относительно простое решение, как это сделать. Может быть возможно сделать if и while l oop с перерывами, но я вроде как пытаюсь найти решение.

Есть ли простой (даже математический способ) сделать это в R?

Ответы [ 2 ]

2 голосов
/ 01 апреля 2020

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

x[-seq(max(sapply(1:4, function(y) which(x == y)[1])))]

# [1]  4  5  5  3  2 11  1  3  3  4  1

Данные

x <- c(1, 1, 2, 3, 3, 3, 4, 4, 5, 5, 3, 2, 11, 1, 3, 3, 4, 1)
2 голосов
/ 01 апреля 2020

Для этого можно использовать кодировку длины серии

x  = c(1, 1, 2, 3, 3, 3, 4, 4, 5, 5, 3, 2, 11, 1, 3, 3, 4, 1)
encoded = rle(x)

# Pick the first location of 1, 2, 3, and 4
# Then find the max index location
indices = c(which(encoded$values == 1)[1], 
            which(encoded$values == 2)[1],
            which(encoded$values == 3)[1],
            which(encoded$values == 4)[1])

index = max(indices)

# Find the index of x corresponding to your split location
reqd_index = cumsum(encoded$lengths)[index-1] + 2 

# Print final split value
x[reqd_index:length(x)]

Результат выглядит следующим образом

> x[reqd_index:length(x)]
 [1]  4  5  5  3  2 11  1  3  3  4  1
...