在最简单的情况下假设一个向量:
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)
当然还有他们的位置。
答案 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
将为您提供向量中相同元素的连续运行的lengths
和values
。
rle(value)
#Run Length Encoding
# lengths: int [1:5] 4 6 7 5 5
# values : num [1:5] 0 1 2 1 0
然后,您可以根据需要操纵lengths
或values
。
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
这可以变成单线,但我将其保留为更清晰。