我有一个数据帧.我希望检测连续数字并将新列填充为1或0.
ID Val
1 a 8
2 a 7
3 a 5
4 a 4
5 a 3
6 a 1
Run Code Online (Sandbox Code Playgroud)
预期产出
ID Val outP
1 a 8 0
2 a 7 1
3 a 5 0
4 a 4 1
5 a 3 1
6 a 1 0
Run Code Online (Sandbox Code Playgroud)
您可以将此diff功能与此功能结合使用,abs并查看结果是否为1其他值:
d$outP <- c(0, abs(diff(d$Val)) == 1)
Run Code Online (Sandbox Code Playgroud)
这使:
> d
ID Val outP
1 a 8 0
2 a 7 1
3 a 5 0
4 a 4 1
5 a 3 1
6 a 1 0
Run Code Online (Sandbox Code Playgroud)
如果您只想考虑减少的连续值,可以使用:
c(0, diff(d$Val) == -1)
Run Code Online (Sandbox Code Playgroud)
如果要为每个执行此操作ID,也可以在基本R或使用dplyr执行此操作:
# base R
d$outP <- ave(d$Val, d$ID, FUN = function(x) c(0, abs(diff(x)) == 1))
# dplyr
library(dplyr)
d %>%
group_by(ID) %>%
mutate(outP = c(0, abs(diff(Val)) == 1))
Run Code Online (Sandbox Code Playgroud)