我有一个载体
[1] 1 1 2 2 2 2 3 3 3 4 4 4 4 5 5 5 6 6 6 7 7 8 8 8 8 8
我希望通过收集索引的值对其进行分组,即我想要数据框
data.frame(value=c(1,2,3,4,5,6,7,8),
beg=c(1,3,7,10,14,17,20,22),
end=c(2,6,9,13,16,19,21,26))
(或任何其他等效数据结构,例如列表列表)。
答案 0 :(得分:5)
将hrbrmstr的评论转为答案
x <- c(1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 8, 8)
data.frame(value = rle(x)$values,
begin = cumsum(rle(x)$lengths) - rle(x)$lengths + 1,
end = cumsum(rle(x)$lengths))
value begin end
1 1 1 2
2 2 3 6
3 3 7 9
4 4 10 13
5 5 14 16
6 6 17 19
7 7 20 21
8 8 22 26
答案 1 :(得分:3)
根据输入数据,找到分组向量的第一个和最后一个观察的索引(&#39; x&#39;)将得到结果。
library(data.table) #data.table_1.9.5
setDT(list(x))[, list(beg=.I[1L], eng=.I[.N]), list(value=V1)]
# value beg eng
#1: 1 1 2
#2: 2 3 6
#3: 3 7 9
#4: 4 10 13
#5: 5 14 16
#6: 6 17 19
#7: 7 20 21
#8: 8 22 26
但是,如果向量是&#39; x1&#39;并且非连续块应该被视为单独的组(即1,3),然后使用rleid
作为v1.9.5中的新功能引入
setDT(list(x1))[, list(beg=.I[1L], eng=.I[.N]),
list(value1=rleid(V1), value=V1)][,value1:=NULL][]
# value beg eng
#1: 1 1 2
#2: 2 3 6
#3: 3 7 9
#4: 4 10 13
#5: 5 14 16
#6: 6 17 19
#7: 7 20 21
#8: 3 22 24
#9: 1 25 26
x <- c(1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7,
8, 8, 8, 8, 8)
x1 <- x
x1[22:24] <- 3
x1[25:26] <- 1
答案 2 :(得分:2)
rle
是要走的路 -
这让你大部分时间......
x <- c(1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4 ,4 ,5, 5, 5, 6, 6, 6, 7, 7, 8, 8 ,8 ,8, 8)
library(dplyr)
temp <- rle(x)
df <- data.frame(
value = temp$values,
end1 = temp$lengths
) %>%
mutate(end = cumsum(end1),
beg = lag(end)+1) %>%
select(value, beg, end)
只需要在1
中加入第一个起点。
# value beg end
#1 1 NA 2
#2 2 3 6
#3 3 7 9
#4 4 10 13
#5 5 14 16
#6 6 17 19
#7 7 20 21
#8 8 22 26