我想比较给定行的上一行和下一行。我为此目的使用了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
答案 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