我该如何使用这个数组:
a <- c(1,2,3,30,30,30,30,30,2,2,3,3,3,30)
输出一个包含相同元素出现索引信息的结果,我希望得到的输出是[30, 5, 4]
或不同的顺序,其中5是30的连续计数,4是计数开始的索引。请注意,数组中的最后一个30在此输出中不被识别。
谢谢!
我该如何使用这个数组:
a <- c(1,2,3,30,30,30,30,30,2,2,3,3,3,30)
输出一个包含相同元素出现索引信息的结果,我希望得到的输出是[30, 5, 4]
或不同的顺序,其中5是30的连续计数,4是计数开始的索引。请注意,数组中的最后一个30在此输出中不被识别。
谢谢!
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
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)
。
with(rle(a), { data.frame(lengths, values, position = cumsum(lengths) - lengths + 1) })
这个怎么样? - Ben