Это расширение проблемы R, которую я спрашивал ранее: Как выбирать строки с определенными значениями в группе в R
Мне очень помогли в этом вопросе, но он получилнемного сложнее, и я надеюсь получить советы, как с этим справиться.
Мои данные выглядят так:
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)
Я хотел бы выбрать только специальные строки в группе (идентификатор).Эти строки должны быть выбраны в соответствии со следующей процедурой:
Если возможно, я хотел бы сохранить последнюю строку с положительным значением для event.timeline.ys для каждого участника (т. Е. Последнюю строку в ID-группес event.timeline.ys> = 0), в котором исходная переменная не является NA, но имеет допустимое значение (например, для ID == 800033 это будет строка 2).
Кроме того, я хотел бы сохранить первую строку с отрицательным значением для event.timeline.ys для каждого участника (т. Е. Первую строку в ID-группе с event.timeline.ys <0), в которойпеременная результата не является NA (например, для ID == 800033 это будет строка 4). </p>
В особом случае ID == 800076, который не имеет значений не-NA в переменной результата, когдаevent.timeline.ys <0, я все еще хотел бы сохранить первую строку, в которой event.timeline.ys <0. </p>
Человек с ID = 800100 не имеет отрицательных значений в event.timeline.ys.В этом случае я хотел бы сохранить только последнюю строку с event.timeline.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 (для идентификатора == 800076), что вызывает сожаление.
Заранее большое спасибо!