比较上一行和下一行并设置条件

时间:2018-03-19 19:53:40

标签: r

我想比较给定行的上一行和下一行。我为此目的使用了diff函数,但不幸的是它没有给出我需要的东西。类似的帖子是here,但我的帖子是寻找不同的东西!

这就是我的意思

test = data.frame(y1=c(10,22,22,36,36,36,38),
                      y2=c(12,22,18,21,14,17,15))  

> test
  y1 y2
1 10 12
2 22 22
3 22 18
4 36 21
5 36 14
6 36 17
7 38 15

我试过

test%>%
mutate(diff_y1=c(NA,diff(y1)))

  y1 y2 diff_y1
1 10 12      NA
2 22 22      12
3 22 18       0
4 36 21      14
5 36 14       0
6 36 17       0
7 38 15       2

我想要的是,如果该行的前一个行有下一个连续的行,则分配相同的差异编号。请注意,diff函数提供了不同的diff_y1值。这是正常的。我想要添加的是,如果第一行开始连续的行,则设置相同的diff值。

如果行i和i + 1或i和i-1相同,我想在第i行和i + 1或i和i-1上使用0。

这样的东西是预期的输出

      y1 y2 diff_y1
    1 10 12      NA
    2 22 22       0
    3 22 18       0
    4 36 21       0
    5 36 14       0
    6 36 17       0
    7 38 15       2

2 个答案:

答案 0 :(得分:1)

如果第i行和第i + 1行相同,则第i行和第i + 1行为0。

我们首先应用diff r函数。 只要第i行的差值为0,就意味着"差异"第i-1行也应设为0.

customdiff <- function(x){
  res<-c(NA,diff(x))
  res[which(res==0)-1]=0
  res
}

test%>%
  mutate(diff_y1=customdiff(y1))

答案 1 :(得分:1)

为了提供替代方案,您可以使用幻想dplyr套餐,尤其是case_when()lead()lag()

library(dplyr)
test = data.frame(y1=c(10,22,22,36,36,36,38),
                  y2=c(12,22,18,21,14,17,15))
test %>%
  mutate(prev_ = lag(y1),                 # the previous item
         next_ = lead(y1),                # the next item
         diff_y1 = case_when(             # ifelse 
           y1 == next_ | y1 == prev_ ~ 0,
           TRUE ~ y1-prev_
         )) %>%
  select(-prev_,-next_)                   # deselect prev & next

哪个收益

  y1 y2 diff_y1
1 10 12      NA
2 22 22       0
3 22 18       0
4 36 21       0
5 36 14       0
6 36 17       0
7 38 15       2