组矢量元素

时间:2015-03-09 01:49:52

标签: r

我有一个载体

 [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))

(或任何其他等效数据结构,例如列表列表)。

3 个答案:

答案 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