首页 > 解决方案 > 如何在 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列是跨时间(即 T2 - T1)中每个 ID 之间的差异。

此外,如何概括多列和多个 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  

标签: rdataframedplyrtidyversepanel-data

解决方案


如果您使用的是dplyr1.0.0(或更高版本),summarise则可以在输出中返回多行,因此如果您有 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))

推荐阅读