2

嗨,我有一个这样的数据框。

df= structure(list(x = c(116, 116, 176, 176, 367, 367, 367), order = c("1", "2", "1", "2", "1", "2", "3")
            , value = c(8.6, 9.23, 8.9, 9.06,9.57, 10.48, 11.3))
            , row.names = c("1", "2", "3", "4", "5","6", "7"), class = "data.frame")

    x order value
1 116     1  8.60
2 116     2  9.23
3 176     1  8.90
4 176     2  9.06
5 367     1  9.57
6 367     2 10.48
7 367     3 11.30

我喜欢做的,没有循环,是得到每个唯一 x 样本的最后一个和第一个时间顺序的差异。例如,367 应该是 1.73。我尝试使用带有延迟的 dplyr,但我似乎无法弄清楚如何确保差异仅在最后一个和第一个之间。

df %>% 
 dplyr::group_by(x) %>% 
 dplyr::mutate(diff = value - lag(value)) %>%  data.frame()

这对所有 x 产生零差异。

谢谢。

4

2 回答 2

2

只需使用first()last()

df %>% 
 dplyr::group_by(x) %>% 
 dplyr::mutate(diff = last(value) - first(value)) %>%  data.frame()
于 2020-01-09T18:15:13.867 回答
1

如果已经订购,那么我们可以使用diff(range)

library(dplyr)
df %>% 
    group_by(x) %>%
     mutate(diff = diff(range(value)))
于 2020-01-09T18:33:01.323 回答