如何在 R 中以长格式获取具有数据帧的组之间的差异?

How to get the difference between groups with a dataframe in long format in R?

有一个包含 2 个 ID (N = 2) 和 2 个周期 (T = 2) 的简单数据帧,例如:

 year    id    points
   1      1     10
   1      2     12
   2      1     20
   2      2     18

如何实现以下数据帧(最好使用 dplyr 或任何 tidyverse 解决方案)?

 id    points_difference
  1         10   
  2         6   

注意points_difference栏是每个ID在跨时间(即T2-T1)的差异。

此外,如何对多列和多个 ID(只有 2 个句点)进行泛化?

 year    id    points  scores
   1      1      10      7
   1     ...    ...     ...
   1      N      12      8
   2      1      20      9
   2     ...    ...     ...
   2      N      12      9

 id    points_difference   scores_difference
  1         10                     2
 ...        ...                   ...
  N          0                     1  

如果您使用的是 dplyr 1.0.0(或更高版本),summarise 可以在输出中 return 多行,因此如果您有超过 2 个周期,这也适用。你可以这样做:

library(dplyr)

df %>%
  arrange(id, year) %>%
  group_by(id) %>%
  summarise(across(c(points, scores), diff, .names = '{col}_difference'))

#     id points_difference scores_difference
#  <int>             <int>             <int>
#1     1                10                 2
#2     1                -7                 1
#3     2                 6                 2
#4     2                -3                 3

数据

df <- structure(list(year = c(1L, 1L, 2L, 2L, 3L, 3L), id = c(1L, 2L, 
1L, 2L, 1L, 2L), points = c(10L, 12L, 20L, 18L, 13L, 15L), scores = c(2L, 
3L, 4L, 5L, 5L, 8L)), class = "data.frame", row.names = c(NA, -6L))