[英]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.