我对 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 的所有观察结果。
感谢任何帮助!
可以有多种方法来解决这个问题。一种方法是使用
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)