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)
我们可以arrange通过id和timepoint为每个组选择时的第一次出现,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)