在R中寻找连续相同元素的索引。

3

我该如何使用这个数组:

a <- c(1,2,3,30,30,30,30,30,2,2,3,3,3,30)

输出一个包含相同元素出现索引信息的结果,我希望得到的输出是[30, 5, 4]或不同的顺序,其中5是30的连续计数,4是计数开始的索引。请注意,数组中的最后一个30在此输出中不被识别。

谢谢!


2
with(rle(a), { data.frame(lengths, values, position = cumsum(lengths) - lengths + 1) }) 这个怎么样? - Ben
2个回答

1
a <- c(1,2,3,30,30,30,30,30,2,2,3,3,3,30)
vec <- unique(a)
indeX=c()
counT <- c()
count=1
valuE<- c()
for (m in 1:(length(a)-1)) {
     
    if (a[m]==a[m+1]) {
        value <- a[m]
        count=count+1
    }else{
      if (count>1) {
        indeX[m] <-m-count+1
        counT[m] <- count
        valuE[m] <- value
      }
      count=1
    }

    
    
  }


indeX <- as.vector(na.omit(indeX))
counT <- as.vector(na.omit(counT))
valuE <- as.vector(na.omit(valuE))
list=list()
for (k in 1:length(indeX)) {
  list[[k]] <-c(valuE[k],counT[k],indeX[k])
}

输出

> list
[[1]]
[1] 30  5  4

[[2]]
[1] 2 2 9

[[3]]
[1]  3  3 11

1
使用 data.table -
library(data.table)

a <- c(1,2,3,30,30,30,30,30,2,2,3,3,3,30)
dt <- data.table(a, row = seq_along(a))
dt[, .(a = first(a), length = .N, row = first(row)), rleid(a)]

#   rleid  a length row
#1:     1  1      1   1
#2:     2  2      1   2
#3:     3  3      1   3
#4:     4 30      5   4
#5:     5  2      2   9
#6:     6  3      3  11
#7:     7 30      1  14

如果您需要仅包含长度大于1的行,则可以添加|> subset(length > 1)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接