Как выбрать строки с определенными значениями для комбинации двух переменных в группе в R - PullRequest
3 голосов
/ 03 мая 2019

Это расширение проблемы 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), что вызывает сожаление.

Заранее большое спасибо!

Ответы [ 3 ]

1 голос
/ 03 мая 2019

Использование dplyr:

dd %>%
group_by(ID, event.timeline.ys>=0) %>%
arrange(ID, event.timeline.ys>=0, abs(event.timeline.ys)) %>%
filter(!is.na(outcome) | n()==1) %>%
filter(row_number()==1) %>%
ungroup() %>%
select(-one_of('event.timeline.ys >= 0'))

Вывод:

  event.timeline.ys     ID  year group outcome
              <int>  <int> <int> <fct>   <int>
1                -1 800033  2011 A           2
2                 1 800033  2009 A           3
3                -1 800076  2009 B          NA
4                 0 800076  2008 B           2
5                 1 800100  2018 C           3
6                -1 800125  2009 A           1
7                 0 800125  2008 A           2
1 голос
/ 03 мая 2019

Просто чтобы соответствовать моему предыдущему ответу, используя data.table, мы можем использовать условие ifelse для выбора строк

library(data.table)
setDT(dd)
dd[, .SD[na.omit(c(ifelse(any(event.timeline.ys >= 0 & !is.na(outcome)),
                          last(which(event.timeline.ys >= 0 & !is.na(outcome))), 
                          last(which(event.timeline.ys >= 0))),
                   ifelse(any(event.timeline.ys < 0 & !is.na(outcome)),
                          first(which(event.timeline.ys < 0 & !is.na(outcome))), 
                          first(which(event.timeline.ys < 0)))))],
   by=ID]


       ID event.timeline.ys year group outcome
1: 800033                 1 2009     A       3
2: 800033                -1 2011     A       2
3: 800076                 0 2008     B       2
4: 800076                -1 2009     B      NA
5: 800100                 1 2018     C       3
6: 800125                 0 2008     A       2
7: 800125                -1 2009     A       1
8: 800031                 1 2009     A       3
9: 800031                -2 2012     A       1
1 голос
/ 03 мая 2019

Вот решение с использованием dplyr и wrapr трубы %.>%. Я добавляю outcome_na и подготавливаю его для соответствия условию "не имеет значений, отличных от NA".

library(dplyr)
library(wrapr)

dd %>%
  group_by(ID) %>%
  mutate(outcome_na = !is.na(outcome)) %.>%
  bind_rows(
    filter(., event.timeline.ys >= 0) %>% arrange(outcome_na, year) %>% slice(n()),
    filter(., event.timeline.ys < 0) %>% arrange(desc(outcome_na), year) %>% slice(1)
  ) %>%
  arrange(ID) %>%
  select(-outcome_na)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...