【问题标题】:Check if one element equal the previous element R检查一个元素是否等于前一个元素 R
【发布时间】:2017-03-15 01:00:01
【问题描述】:

我正在尝试创建一个逻辑向量来检查一个元素是否等于前一个元素。

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])}

这将永远持续下去。有没有矢量化的方式来做到这一点?

【问题讨论】:

  • c(FALSE, head(vector, -1) == tail(vector, -1))
  • 您也可以:c(FALSE,vector[-1]==vector[-length(vector)]).
  • 那行得通,只需要一个适应c(FALSE, !diff(x) &gt;0) 或者它返回相反。知道如何对字符向量执行此操作吗?

标签: r loops vector vectorization


【解决方案1】:

我们可以使用(对于整数向量更好)

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)])

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

【讨论】:

    【解决方案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)]
    

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-29
      • 2019-02-12
      • 1970-01-01
      • 2017-08-04
      • 1970-01-01
      相关资源
      最近更新 更多