检查一个元素是否等于前一个元素R

时间:2016-11-01 19:57:38

标签: r loops vector vectorization

我试图制作一个逻辑向量来检查一个元素是否等于前一个元素。

vector <- c(1, 1, 2, 2, 2, 3, 3)

我想检查每个元素是否与之​​前相同,因此结果应为:

   FALSE TRUE FALSE TRUE TRUE FALSE TRUE

我知道我可以制作一个循环,但它效率不高(我有1600万行df)。 所以

它不是理想的,但我能管理的是:

for(i in 2:length(vector)) {print(vector[i] == vector[i-1])}

这需要永远。有没有矢量化的方法呢?

2 个答案:

答案 0 :(得分:4)

我们可以使用(更好的是整数向量)

c(FALSE, diff(x) == 0)

示例

x <- c(1L, 1L, 2L, 2L, 2L, 3L, 3L)

c(FALSE, diff(x) == 0)
#[1] FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE

如果您的向量包含浮点数,则更稳健:

c(FALSE, abs(diff(x)) < .Machine$double.eps ^ 0.5)

但对于真正巨大的矢量而言,它的成本会增加三倍,并且可能比上面的速度慢三倍。

如果你有角色向量,我们可以使用

c(FALSE, x[-1] == x[-length(x)])

使用"=="比较字符串总是安全的。

答案 1 :(得分:2)

这是一个data.table答案。请注意,第一项实际上是NA。如果需要,您可以手动编辑该文件。

library("data.table")
vector <- c(1, 1, 2, 2, 2, 3, 3)

df <- data.frame(original=vector)
setDT(df)
df[, prev_eq := original==shift(vector,1)]