如何根据每个受试者的列数据过滤具有多个受试者的多个观察值的数据集?

问题描述 投票:0回答:1

我对 R 还很陌生,所以如果这是显而易见的,我深表歉意,但我在其他地方找不到这个问题的答案,或者也许我还没有找到提出正确问题的词语!

我有一个数据集,描述患者评分如何随时间变化,因此每个患者都有一个唯一的受试者 ID,然后每个患者都有多个观察结果。我正在查看事件“switch”之前和之后分数如何变化,因此我有一个变量 timesSinceswitch,其中包括负变量和正变量。当我可视化数据时,我可以看到有几位患者在切换前或切换后没有观察结果。我想从数据中完全排除这些患者,因此我只看到在切换之前和之后都有观察结果的患者。

我尝试过过滤和子集,因为我之前使用过这些函数,但对于这些函数,我只使用了一两个条件,例如在 2 个值或不 = 0 的子集分数之间进行过滤。

我正在努力解决如何将其应用于每个唯一的受试者 ID,以便它检查适用于每个患者的行中的负值和正值,然后根据是否满足该患者的所有行来包含/排除该患者的所有行标准。

我的数据框称为轨迹

主题_id 自从切换以来的时间
1 -1
1 -.5
1 .5
1 2
2 -1
2 -.5
3 .5
3 2

因此,在这个非常粗略的示例中,我想要一行代码来排除与主题 2 和 3 有关的所有行,因为它们都不符合我在切换之前和之后具有时间点的标准。

我已经尝试过,但它没有删除任何内容:

Trajectories %>%
  group_by(subject_id) %>%
  filter(timeSinceSwitch<0 & timeSinceSwitch>0)

我觉得我所要求的只是查看单个观察水平,这就是为什么它包含所有内容,而不是考虑一个主题 ID 的所有观察结果。

感谢任何帮助!

r conditional-statements
1个回答
0
投票

可以有多种方法来解决这个问题。一种方法是使用

sign
函数,该函数对于负值返回 -1,对于正值返回 +1,并且我们确保组中至少有这些值之一。

library(dplyr)

Trajectories %>% filter(all(c(-1, 1) %in% sign(timeSinceSwitch)), .by = subject_id)

#  subject_id timeSinceSwitch
#1          1            -1.0
#2          1            -0.5
#3          1             0.5
#4          1             2.0

另一个更接近您尝试的选项是使用

any
函数。

Trajectories %>%
  filter(any(timeSinceSwitch < 0) && any(timeSinceSwitch > 0), .by = subject_id)
© www.soinside.com 2019 - 2024. All rights reserved.