这是我之前提出的一个 R 问题的扩展:如何在 R 中选择特定组内具有特定值的行
我得到了很好的帮助,但现在情况变得更加复杂,我希望能够得到处理此问题的建议。
我的数据看起来像这样:
我希望只选择组(ID)内的特殊行。这些行应根据以下过程选择:
如果可能,我想保留每个参与者(即,在具有事件时间轴上ys值≥0的ID组中的最后一行),其结果变量不是NA但具有有效值的最后一行(例如,对于ID == 800033,这将是第2行)。
此外,我想保留每个参与者的第一行,其中事件时间轴上ys值小于0且结果变量不是NA(即,在具有事件时间轴上ys值<0的ID组中的第一行;例如,对于ID == 800033,这将是第4行)。
在ID == 800076的特殊情况下,当事件时间轴.ys < 0时没有任何非NA值的结果变量,我仍然希望保留事件时间轴.ys < 0的第一行。
ID = 800100的人在事件时间轴.ys上没有任何负值。在这种情况下,我只想保留事件时间轴上ys值≥0的最后一行。
所有其他行应该被删除。最终数据框应该是这样的:
我非常感谢有关如何解决这个问题的建议。我已经尝试过以下方法:
然而,我会失去第16行(对于ID == 800076),这是不幸的。提前感谢您!
我的数据看起来像这样:
dd <- read.table(text="
event.timeline.ys ID year group outcome
1 2 800033 2008 A 3
2 1 800033 2009 A 3
3 0 800033 2010 A NA
4 -1 800033 2011 A 2
5 -2 800033 2012 A 1
15 0 800076 2008 B 2
16 -1 800076 2009 B NA
17 5 800100 2014 C 4
18 4 800100 2015 C 4
19 2 800100 2017 C 4
20 1 800100 2018 C 3
30 0 800125 2008 A 2
31 -1 800125 2009 A 1
32 -2 800125 2010 A NA
33 2 800031 2008 A 3
34 1 800031 2009 A 3
35 0 800031 2010 A NA
36 -1 800031 2011 A NA
37 -2 800031 2012 A 1", header=TRUE)
我希望只选择组(ID)内的特殊行。这些行应根据以下过程选择:
如果可能,我想保留每个参与者(即,在具有事件时间轴上ys值≥0的ID组中的最后一行),其结果变量不是NA但具有有效值的最后一行(例如,对于ID == 800033,这将是第2行)。
此外,我想保留每个参与者的第一行,其中事件时间轴上ys值小于0且结果变量不是NA(即,在具有事件时间轴上ys值<0的ID组中的第一行;例如,对于ID == 800033,这将是第4行)。
在ID == 800076的特殊情况下,当事件时间轴.ys < 0时没有任何非NA值的结果变量,我仍然希望保留事件时间轴.ys < 0的第一行。
ID = 800100的人在事件时间轴.ys上没有任何负值。在这种情况下,我只想保留事件时间轴上ys值≥0的最后一行。
所有其他行应该被删除。最终数据框应该是这样的:
event.timeline.ys ID year group outcome
2 1 800033 2009 A 3
4 -1 800033 2011 A 2
15 0 800076 2008 B 2
16 -1 800076 2009 B NA
20 1 800100 2018 C 3
30 0 800125 2008 A 2
31 -1 800125 2009 A 1
34 1 800031 2009 A 3
37 -2 800031 2012 A 1
我非常感谢有关如何解决这个问题的建议。我已经尝试过以下方法:
dd %>%
group_by(ID) %>%
filter(row_number() == last(which(event.timeline.ys >= 0 & outcome >= 0)) |
row_number() == first(which(event.timeline.ys < 0 & outcome >= 0)))
然而,我会失去第16行(对于ID == 800076),这是不幸的。提前感谢您!
outcome_na
对event.timeline.ys < 0
进行排序,但这次是按降序排列,因为您想要的不是最后一行,而是第一行。 - Paweł Chabros