r - 索引向量中的连续重复项

标签 r vector

获取重复 # 次的所有元素的索引的最佳方法是什么?我想识别重复超过 2 次的元素。rle()rleid()两者都暗示了我需要的值,但两种方法都没有直接给我索引。

我想出了这个代码:

t1 <- c(1, 10, 10, 10, 14, 37, 3, 14, 8, 8, 8, 8, 39, 12)

t2 <- lag(t1,1)
t2[is.na(t2)] <- 0
t3 <- ifelse(t1 - t2 == 0, 1, 0)
t4 <- rep(0, length(t3))
for (i in 2:length(t3)) t4[i] <- ifelse(t3[i] > 0, t3[i - 1] + t3[i], 0)

which(t4 > 1)

返回:
[1]  4 11 12 

这些就是我需要的值(value)观。

有没有更合适的 R 函数?

最佳答案

data.table 的一种选择。没有真正的理由使用它来代替 lag/shift当 n = 2 时,但对于较大的 n,这将使您免于创建大量新的滞后向量。

library(data.table)

which(rowid(rleid(t1)) > 2)
# [1]  4 11 12

解释:
rleid将为每个相等值的“运行”生成一个唯一值,并且 rowid将标记每个元素“进入”运行的元素数量。您想要的是超过 2 个“进入”运行的元素。
data.table(
  t1,
  rleid(t1),
  rowid(t1))

#     t1 V2 V3
#  1:  1  1  1
#  2: 10  2  1
#  3: 10  2  2
#  4: 10  2  3
#  5: 14  3  1
#  6: 37  4  1
#  7:  3  5  1
#  8: 14  6  2
#  9:  8  7  1
# 10:  8  7  2
# 11:  8  7  3
# 12:  8  7  4
# 13: 39  8  1
# 14: 12  9  1

编辑:如果在这个问题提出的示例中,没有两次运行(甚至长度为 1 的“运行”)具有相同的值(或者如果您不关心重复项是否彼此相邻),您可以使用 which(rowid(t1) > 2)反而。 (这是弗兰克在评论中指出的)

希望这个例子可以澄清差异
a <- c(1, 1, 1, 2, 2, 1)
which(rowid(a) > 2)
# [1] 3 6
which(rowid(rleid(a)) > 2)
# [1] 3

关于r - 索引向量中的连续重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56737284/

相关文章:

r - ggplot2 热图 : using different gradients for categories

c++ - 低功耗处理器的快速搜索-插入-删除算法

R - 简洁地将向量添加到每个向量元素

javascript - 当仅绘制某些观察值时,框选择时返回不正确的行索引 - Plotly、htmlWidgets、Shiny

r - 屏幕抓取实际页面而不是使用 R 的源 html

r - 交叉何时以及为何对差异进化有益?

r - 在观察中识别随时间变化的模式 (R)

vector - 如何将零添加到整数Vec之前? [复制]

c++ - 如何清除 vector 但保持其容量?

java - 我确定最畅销产品的逻辑是否正确?