我试图制作一个逻辑向量来检查一个元素是否等于前一个元素。
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])}
这需要永远。有没有矢量化的方法呢?
答案 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)]