R: лучший способ найти индекс последнего наблюдения уникальных значений столбца - PullRequest
0 голосов
/ 09 июля 2020

У меня есть следующие данные. Он всегда будет в порядке возрастания. Я хочу иметь возможность найти последние значения всех уникальных значений, т.е. последнее значение 0, 1, 2, 3, 4 ..... В примере ниже 1 не существует, поэтому можно пропустить и перейти к поиску последнего значения 2 и вернуть index .

Мне нужен вектор индексов всех последних наблюдений различных уникальных значений.

Как я могу это сделать? Спасибо.

    structure(c(0, 0, 0, 0, 2, 2, 3, 3, 13, 14, 14, 14, 14, 24, 34, 
35, 37, 38, 38, 40, 42, 42, 43, 43, 44, 54, 54, 54, 64), index = structure(c(1167667200, 
1167753600, 1167840000, 1167926400, 1168012800, 1168099200, 1168185600, 
1168272000, 1168358400, 1168444800, 1168531200, 1168617600, 1168704000, 
1168790400, 1168876800, 1168963200, 1169049600, 1169136000, 1169222400, 
1169308800, 1169395200, 1169481600, 1169568000, 1169654400, 1169740800, 
1169827200, 1169913600, 1.17e+09, 1170086400), tzone = "", tclass = c("POSIXct", 
"POSIXt")), class = c("xts", "zoo"), .Dim = c(29L, 1L), .Dimnames = list(
    NULL, "testing"))

Ответы [ 4 ]

1 голос
/ 09 июля 2020

Вы можете использовать функцию rle, чтобы определить длину прогона каждого значения, а затем проиндексировать в соответствующую строку с помощью cumsum:

indices <- cumsum(rle(as.vector(a))$lengths)
a[indices]
                    testing
2007-01-04 16:00:00       0
2007-01-06 16:00:00       2
2007-01-08 16:00:00       3
2007-01-09 16:00:00      13
2007-01-13 16:00:00      14
2007-01-14 16:00:00      24
2007-01-15 16:00:00      34
2007-01-16 16:00:00      35
2007-01-17 16:00:00      37
2007-01-19 16:00:00      38
2007-01-20 16:00:00      40
2007-01-22 16:00:00      42
2007-01-24 16:00:00      43
2007-01-25 16:00:00      44
2007-01-28 16:00:00      54
2007-01-29 16:00:00      64
1 голос
/ 09 июля 2020

Вы можете попробовать:

which(rev(!duplicated(rev(df$testing))))
#> [1]  4  6  8  9 13 14 15 16 17 19 20 22 24 25 28 29
0 голосов
/ 13 июля 2020

1) Если x является входным объектом xts, тогда это дает индексы последнего вхождения каждого элемента.

findInterval(unique(x), x)
## [1]  4  6  8  9 13 14 15 16 17 19 20 22 24 25 28 29

2) Эта альтернатива дает именованный вектор в качестве результата:

cumsum(table(x))
##  0  2  3 13 14 24 34 35 37 38 40 42 43 44 54 64 
##  4  6  8  9 13 14 15 16 17 19 20 22 24 25 28 29 
0 голосов
/ 09 июля 2020
library(zoo)
df <- as.data.frame(df)
cumsum(rle(df$testing)$lengths)
# [1]  4  6  8  9 13 14 15 16 17 19 20 22 24 25 28 29
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...