【发布时间】:2020-05-09 17:40:58
【问题描述】:
我有一个时间序列:
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),]
但这给出了错误的答案。
【问题讨论】:
标签: r dataframe duplicates subset
我有一个时间序列:
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),]
但这给出了错误的答案。
【问题讨论】:
标签: r dataframe duplicates subset
你可以这样做:
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
【讨论】:
使用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
【讨论】:
在base 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
【讨论】:
另一个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
【讨论】:
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,]
【讨论】: