获取重复 # 次的所有元素的索引的最佳方法是什么?我想识别重复超过 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/