在 dplyr::group_by() 之后进行组内的 diff 操作

问题描述 投票:0回答:2

假设我有这个 data.frame (有 3 个变量)

ID  Period  Score
123 2013    146
123 2014    133
23  2013    150
456 2013    205
456 2014    219
456 2015    140
78  2012    192
78  2013    199
78  2014    133
78  2015    170

使用 dplyr 我可以按 ID 对它们进行分组并过滤这些出现多次的 ID

data <- data %>% group_by(ID) %>% filter(n() > 1)

现在,我想要实现的是添加一个列: 差值 = P 时段得分 - P-1 时段得分 得到这样的东西:

ID  Period  Score   Difference
123 2013    146 
123 2014    133 -13
456 2013    205 
456 2014    219 14
456 2015    140 -79
78  2012    192 
78  2013    199 7
78  2014    133 -66
78  2015    170 37

在电子表格中执行此操作相当简单,但我不知道如何在 R 中实现此目的。
感谢您的任何帮助或指导。

r group-by diff dplyr
2个回答
48
投票

这是使用

lag
的另一种解决方案。根据用例,它可能比
diff
更方便,因为
NAs
清楚地表明特定值没有前驱,而使用
0
diff
可能是 a) 缺少前驱或b) 两个周期之间的减法。

data %>% group_by(ID) %>% filter(n() > 1) %>%
  mutate(
    Difference = Score - lag(Score)
    )

#   ID Period Score Difference
# 1 123   2013   146         NA
# 2 123   2014   133        -13
# 3 456   2013   205         NA
# 4 456   2014   219         14
# 5 456   2015   140        -79
# 6  78   2012   192         NA
# 7  78   2013   199          7
# 8  78   2014   133        -66
# 9  78   2015   170         37

0
投票

Diff 也适合于此。 diff之前必须有另一个group_by。

data <- data %>% group_by(ID) %>% 
                 filter(n() > 1) %>% 
                 group_by(ID) %>% 
                 mutate(Difference = c(NA, diff(Score)))
© www.soinside.com 2019 - 2024. All rights reserved.