Удалить идентичные значения, если они совпадают с предыдущими во временном ряду - PullRequest
3 голосов
/ 23 января 2020

У меня есть временной ряд:

 df <- data.frame(t=1:10, x= c(5,7,8,9,5,5,5,5,4,3))

Я хочу удалить значения, идентичные предыдущему значению, чтобы получить:

 x = c(5,7,8,9,5,4,3)

Я пытался:

 df[unique(df$x),]

Но это дает неправильный ответ.

Ответы [ 5 ]

3 голосов
/ 23 января 2020

Вы можете сделать:

df[c(1, diff(df$x)) != 0, ] 

   t x
1  1 5
2  2 7
3  3 8
4  4 9
5  5 5
6  9 4
7 10 3
2 голосов
/ 28 января 2020

Другое решение base будет использовать rle.

Если вы хотите создать подкадр данных на основе критериев, вы можете использовать lengths. В противном случае, если вам нужно только подмножество столбца x, мы должны извлечь значения из rle. См. Ниже;

df[cumsum(rle(df$x)$lengths), ] # dataframe subset

#     t x
# 1   1 5
# 2   2 7
# 3   3 8
# 4   4 9
# 8   8 5
# 9   9 4
# 10 10 3
rle(df$x)$values # vector of values

# [1] 5 7 8 9 5 4 3


Или с использованием data.table:

library(data.table)

setDT(df_large)[, rn :=1:.N, by = rleid(x)][rn == 1, .(t, x)]

 #     t x
 # 1:  1 5
 # 2:  2 7
 # 3:  3 8
 # 4:  4 9
 # 5:  5 5
 # 6:  9 4
 # 7: 10 3
2 голосов
/ 23 января 2020

В базе R мы можем использовать head и tail

subset(df, c(TRUE, head(x, -1) != tail(x, -1)))

#    t x
#1   1 5
#2   2 7
#3   3 8
#4   4 9
#5   5 5
#9   9 4
#10 10 3
2 голосов
/ 23 января 2020

С dplyr вы можете сделать:

df %>%
 filter(x != lag(x, default = first(x)-1))

   t x
1  1 5
2  2 7
3  3 8
4  4 9
5  5 5
6  9 4
7 10 3
1 голос
/ 23 января 2020
library(dplyr)    

df <- data.frame(t=1:10, x= c(5,7,8,9,5,5,5,5,4,3))

subsetVec <- df$x - lag(df$x) != 0
subsetVec <- replace_na(subsetVec, TRUE)
df[subsetVec,]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...