繁体   English   中英

通过ID查找行之间的差异,但将差异放在R中的第一行

[英]Find difference between rows by id, but place difference on first row in R

我读过一些有关使用dplyr R中两个不同行之间差异的dplyr 但是,我看到的帖子并没有给我我想要的东西。 我想找到时间之间的差,并将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)) 

请让我知道我该如何改变。 谢谢!

您可以使用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

我们可以与lead交换lag

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的相应选项将是type = "lead" shift

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

注意:在示例中,“ id”,“ time”是按顺序排列的。 如果不是,则添加OP中他的帖子中显示的order声明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM