如何从先前的观察 ID 中减去值?

时间:2021-01-23 17:30:06

标签: r dataframe

我正在处理一个奇怪的数据框,其中观测值乱序,并且每个观测值的唯一标识符没有以线性、直接的方式编号。数据集中提供了一个唯一标识符 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
))

2 个答案:

答案 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