通过两个分组变量计算行中值之间的差异
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)))
您可以在 dplyr
和 data.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]
我想使用这个问题的 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)))
您可以在 dplyr
和 data.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]