通过两个分组变量计算行中值之间的差异

Calculate difference between values in rows by two grouping variables

我想使用这个问题的 ave 解决方案: 两组。

#Reproduceable example db:
FU <- c(5,10,20,2,7,20,6,14,8,20,15,17)
Studynr <- c(1,1,2,2,3,3,4,4,4,5,6,6)
Fugroup <- c(1,0,0,1,0,1,1,0,2,0,1,0)
db <- data.frame(Studynr,Fugroup,FU) 

# code to calculate the difference consequetively
db$FUdiff <- ave(db$FU, db$Studynr, FUN=function(x) c(NA,diff(x)))

这是table这个代码提供的头部:

FU Studynr Fugroup FUdiff
5 1 1 NA
10 1 0 5
20 2 0 NA
2 2 1 -18
7 3 0 NA
20 3 1 13

但我想要的是(切换5和NA,因为FU组是1比0排序的)

FU Studynr Fugroup FUdiff
5 1 1 5
10 1 0 NA
20 2 0 NA
2 2 1 -18
7 3 0 NA
20 3 1 13

我认为 ave 代码对我不起作用,因为每个组的数据在数据库中没有连续排序。因此,我不想使用一个分组变量 (db$Studynr),而是使用第二个分组变量 (db$Fugroup)。有任何想法吗?谢谢!

(调整后post)

您可以先 order 数据然后应用 ave 代码:

db <- db[with(db, order(Studynr, Fugroup)), ]
db$FUdiff <- ave(db$FU, db$Studynr, FUN=function(x) c(NA,diff(x)))

您可以在 dplyrdata.table 中实现相同的逻辑:

#dplyr
library(dplyr)

db %>%
  arrange(Studynr, Fugroup) %>%
  group_by(Studynr) %>%
  mutate(FUdiff = c(NA, diff(FU))) %>%
  ungroup -> db

#data.table
library(data.table)
setDT(db)[order(Studynr, Fugroup), FUdiff := c(NA, diff(FU)), Studynr]