子集所有数据,每个数据都有一个不同的数字

时间:2018-08-11 14:57:41

标签: r

在最简单的情况下假设一个向量:

value = c(0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1,0,0,0,0,0)

position = c(1:length(value))

data = cbind(value, position)

如何直接将下面引号中标记的那些值子集化?

value = c(0,0,0,'0',1,1,1,1,1,'1',2,2,2,2,2,2,'2',1,1,1,1,'1',0,0,0,0,0)

当然还有他们的位置。

3 个答案:

答案 0 :(得分:3)

value = c(0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1,0,0,0,0,0)

position = c(1:length(value))

data = cbind(value, position)

library(dplyr)

data.frame(data) %>% filter(value != lead(value))

#   value position
# 1     0        4
# 2     1       10
# 3     2       17
# 4     1       22

我们的理念是filter(即保留)value与下一行value不同的行。

答案 1 :(得分:3)

rle将为您提供向量中相同元素的连续运行的lengthsvalues

rle(value)
#Run Length Encoding
#  lengths: int [1:5] 4 6 7 5 5
#  values : num [1:5] 0 1 2 1 0

然后,您可以根据需要操纵lengthsvalues

data[head(cumsum(rle(value)$lengths), -1),]
#     value position
#[1,]     0        4
#[2,]     1       10
#[3,]     2       17
#[4,]     1       22

答案 2 :(得分:2)

您可以根据连续值之间的差异编制索引。

i <- c(diff(data[, 'value']) != 0, FALSE)
data[i, ]
#     value position
#[1,]     0        4
#[2,]     1       10
#[3,]     2       17
#[4,]     1       22

这可以变成单线,但我将其保留为更清晰。