我已经阅读了一些关于使用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))
请让我知道我应该如何改变这一点。谢谢!
答案 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)
我们可以将lag
与lead
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在其帖子中显示的内容。