我正在处理一个奇怪的数据框,其中观测值乱序,并且每个观测值的唯一标识符没有以线性、直接的方式编号。数据集中提供了一个唯一标识符 ObservationID
,它唯一地标识了观察,以及 PreviousObsId
,它标识了之前的观察。我想从任何给定观察的值中减去先前观察的值。鉴于数据集乱序,我该怎么做?
所以我想要这个:
ObservationID PreviousObsID Value
256A 866D 200
611A 8166Q 415
866D 611A 175
8166Q - 450
变成这样:
ObservationID PreviousObsID Value ValueLessPrevious
256A 866D 200 25
611A 8166Q 415 -35
866D 611A 175 -240
8166Q - 450
我希望这是有道理的——提前致谢。
数据:
structure(list(ObservationID = c("256A", "611A", "866D", "8166Q"
), PreviousObsID = c("866D", "8166Q", "611A", "-"), Value = c(200L,
415L, 175L, 450L)), class = "data.frame", row.names = c(NA, -4L
))
答案 0 :(得分:2)
另一个选项是match
df1$ValueLessPrevious <- with(df1, Value -
Value[match(PreviousObsID, ObservationID)])
df1$ValueLessPrevious
#[1] 25 -35 -240 NA
答案 1 :(得分:1)
通过创建查找(以命名向量的形式)的一种方式。
mydat <- structure(list(ObservationID = c("256A", "611A", "866D", "8166Q"
), PreviousObsID = c("866D", "8166Q", "611A", "-"), Value = c(200L,
415L, 175L, 450L)), class = "data.frame", row.names = c(NA, -4L
))
lu <- mydat$Value
names(lu) <- mydat$ObservationID
mydat$ValueLessPrevious <- mydat$Value - lu[mydat$PreviousObsID]
mydat
#> ObservationID PreviousObsID Value ValueLessPrevious
#> 1 256A 866D 200 25
#> 2 611A 8166Q 415 -35
#> 3 866D 611A 175 -240
#> 4 8166Q - 450 NA