从数据框中有条件地选择重复测量

use*_*494 2 r dplyr data.table

我有在不同时间点对每个主题(id)进行重复测量的数据。我想为每个主题保留两行,时间点== 0,并且时间点最接近4。在具有两个候选时间点与4等距离的行的情况下,例如(3,5),我想选择最低的(3 )。

如下图的“选择”列所示,带有“ x”的行将不会保留。

 dat <- structure(list(id = c(172507L, 172507L, 172507L, 172525L, 172525L, 
172525L, 172526L, 172526L, 172526L, 172527L, 172527L, 172527L, 
172527L, 172527L), timepoint = c(0L, 2L, 6L, 0L, 4L, 5L, 0L, 
5L, 2L, 2L, 3L, 5L, 6L, 0L)), class = "data.frame", row.names = c(NA, 
-14L))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Ron*_*hah 6

我们可以arrange通过idtimepoint为每个组选择时的第一次出现,timepoint == 0以及之间的最小绝对值4 - timepoint。由于我们已经按其排列,因此timepoint which.min将首先选择timepoint较低的值(在平局的情况下)。

library(dplyr)
dat %>%
  arrange(id, timepoint) %>%
  group_by(id) %>%
  slice(c(which.max(timepoint == 0), which.min(abs(4- timepoint))))

#     id timepoint
#   <int>     <int>
#1 172507         0
#2 172507         2
#3 172525         0
#4 172525         4
#5 172526         0
#6 172526         5
#7 172527         0
#8 172527         3
Run Code Online (Sandbox Code Playgroud)