我有一个矢量:
a <- c(1, 1, 0, 0, 1, 2, 0, 0)
Run Code Online (Sandbox Code Playgroud)
我想得到每次运行相等值的开始和结束索引:
number start end
0 3 4
0 7 8
1 1 2
1 5 5
2 6 6
Run Code Online (Sandbox Code Playgroud)
www*_*www 12
来自基地R的解决方案
a <- c(1,1,0,0,1,2,0,0)
# Get run length encoding
b <- rle(a)
# Create a data frame
dt <- data.frame(number = b$values, lengths = b$lengths)
# Get the end
dt$end <- cumsum(dt$lengths)
# Get the start
dt$start <- dt$end - dt$lengths + 1
# Select columns
dt <- dt[, c("number", "start", "end")]
# Sort rows
dt <- dt[order(dt$number), ]
dt
# number start end
#2 0 3 4
#5 0 7 8
#1 1 1 2
#3 1 5 5
#4 2 6 6
Run Code Online (Sandbox Code Playgroud)
这是一个with
使代码更简洁的解决方案.
with(rle(a), data.frame(number = values,
start = cumsum(lengths) - lengths + 1,
end = cumsum(lengths))[order(values),])
# number start end
#2 0 3 4
#5 0 7 8
#1 1 1 2
#3 1 5 5
#4 2 6 6
Run Code Online (Sandbox Code Playgroud)