按ID查找行之间的差异,但在R

时间:2016-08-27 02:22:11

标签: r dplyr

我已经阅读了一些关于使用dplyr查找R中两个不同行之间差异的不同帖子。但是,我见过的帖子并没有给我我想要的东西。我想找出时间之间的差异,并将n和n + 1之间的差异放在一个新变量中,与n在同一行上,有点像n和n + 1之间的持续时间。所有其他帖子将经过的时间放在与n + 1相同的行上。

以下是一些示例数据:

df <- read.table(text = c("
id time
1   1
1   4
1   7
2   5
2   10"), header = T)

我想要的输出:

# id  time duration
#  1     1        3
#  1     4        3
#  1     7       NA
#  2     5        5
#  2    10       NA

目前我有以下代码:

df %>% arrange(id, time) %>% group_by(id) %>% mutate(duration = time - lag(time)) 

请让我知道我应该如何改变这一点。谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用diff(),将NA附加到每个组。只需将mutate()来电更改为

即可
mutate(duration = c(diff(time), NA)))

编辑:为了澄清,上面的代码只是问题中显示的代码中管道末尾的mutate()调用。因此,基于问题中显示的代码,整个操作将是

df %>% 
    arrange(id, time) %>% 
    group_by(id) %>% 
    mutate(duration = c(diff(time), NA)) 
# Source: local data frame [5 x 3]
# Groups: id [2]
#
#      id  time duration
#   <dbl> <dbl>    <dbl>
# 1     1     1        3
# 2     1     4        3
# 3     1     7       NA
# 4     2     5        5
# 5     2    10       NA

答案 1 :(得分:0)

我们可以将laglead

交换
df %>% 
   group_by(id) %>%
   mutate(duration = lead(time)- time)
#      id  time duration
#    <int> <int>    <int> 
#1     1     1        3
#2     1     4        3
#3     1     7       NA
#4     2     5        5
#5     2    10       NA

data.table中的相应选项为shift type = "lead"

library(data.table)
setDT(df)[, duration := shift(time, type = "lead") - time, by = id]

注意:在示例中,'id','time'是有序的。如果不是,请添加order语句作为OP在其帖子中显示的内容。