假设我有以下data.frame:
df = data.frame(x = c(1,3,5,6,8,11,15,16,18,20,21,22,24,25,40,50,54,55,70,71,100,101,102,103))
我需要找出非连续x值之间的滞后。 这意味着要自发地做:3-1、5-3、8-6、11-8、15-11、18-16、20-18、24-22等...
有什么建议吗?
答案 0 :(得分:4)
我们可以取所有值之间的差,但只保留那些不连续的值
with(df, diff(x)[diff(x) != 1])
#[1] 2 2 2 3 4 2 2 2 15 10 4 15 29
答案 1 :(得分:2)
采用@Ronak Shah的方法,我们可以使用dplyr
实现此目标,如下所示:
library(dplyr)
df %>%
transmute(x=lead(x,1)-x) %>%
filter(x!=1)
x
1 2
2 2
3 2
4 3
5 4
6 2
7 2
8 2
9 15
10 10
11 4
12 15
13 29
答案 2 :(得分:2)
使用head
,tail
获得区别。
with(df, {i1 <- tail(x, -1) - head(x, -1); i1[i1 != 1]})
#[1] 2 2 2 3 4 2 2 2 15 10 4 15 29
注意:不重做两次计算
答案 3 :(得分:1)
Do the subtraction like this:
df_lag <- df[2:nrow(df),] - df[1:(nrow(df)-1),]
That will give you the lag you want.
df_lag[df_lag>1]
[1] 2 2 2 3 4 2 2 2 15 10 4 15 29
答案 4 :(得分:1)
您基本上需要构造分组变量,然后从那里获取它,即
c(FALSE, cumsum(diff(df$x) == 1))
#[1] 0 0 0 1 1 1 1 2 2 2 3 4 4 5 5 5 5 6 6 7 7 8 9 10
然后,您可以使用它进行所需的任何计算,例如,不同之处
tapply(df$x, df$new, diff)
#$`0`
#[1] 2 2
#$`1`
#[1] 2 3 4
#$`2`
#[1] 2 2
#$`3`
#numeric(0)
#$`4`
#[1] 2
#$`5`
#[1] 15 10 4
#$`6`
#[1] 15
#$`7`
#[1] 29
#$`8`
#numeric(0)
#$`9`
#numeric(0)
#$`10`
#numeric(0)
答案 5 :(得分:1)
这是另一个答案,它将差值附加到df以及x的起始值:
df = data.frame(x = c(1,3,5,6,8,11,15,16,18,20,21,22,24,25,40,50,54,55,70,71,100,101,102,103))
df$x0 <- c(NA_integer_, df[1:(nrow(df)-1), 'x'])
df$difference = c(0, diff(df$x))
df[df$difference > 1, ]
# x x0 difference
2 3 1 2
3 5 3 2
5 8 6 2
6 11 8 3
7 15 11 4
9 18 16 2
10 20 18 2
13 24 22 2
15 40 25 15
16 50 40 10
17 54 50 4
19 70 55 15
21 100 71 29