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

Я тренируюсь в циклах и функциях в R (но сейчас я нахожусь на базовом уровне). Для недавнего исследования мне нужно подготовить свои данные следующим образом:

У меня есть набор данных, который выглядит следующим образом:

dd <- read.table(text="
    event.timeline.ys     ID     year    group
1                   2     800033 2008    A
2                   1     800033 2009    A   
3                   0     800033 2010    A   
4                  -1     800033 2011    A   
5                  -2     800033 2012    A   
15                  0     800076 2008    B
16                 -1     800076 2009    B
17                  5     800100 2014    C     
18                  4     800100 2015    C   
19                  2     800100 2017    C   
20                  1     800100 2018    C   
30                  0     800125 2008    A    
31                 -1     800125 2009    A    
32                 -2     800125 2010    A", header=TRUE)

Я хотел бы сохранить для каждого человека только строку последняя с event.timeline.ys> = 0 (это будет строка 3 для идентификатора 800033) и строка первая с event.timeline.ys <0 (это будет строка 4 для идентификатора 800033). Все остальные строки будут удалены. Поэтому мой окончательный фрейм данных должен содержать только две строки для каждого идентификатора. </p>

Человек с ID = 800100 не имеет отрицательных значений на event.timeline.ys. В этом случае я хотел бы сохранить только последнюю строку с event.timeline.ys> = 0.

Окончательный набор данных будет выглядеть следующим образом:

    event.timeline.ys     ID     year    group  
3                   0     800033 2010    A   
4                  -1     800033 2011    A      
15                  0     800076 2008    B
16                 -1     800076 2009    B 
20                  1     800100 2018    C   
30                  0     800125 2008    A    
31                 -1     800125 2009    A    

Я думал об использовании цикла for для проверки внутри каждого идентификатора, что такое строка last с event.timeline.ys> = 0 и строка first с event.timeline. да <0 есть. Однако практическая реализация в R не удается. </p>

У кого-нибудь есть умный совет? Я также очень открыт для других решений, которые не основаны на циклах for или подобных вещах.

Ответы [ 4 ]

1 голос
/ 25 апреля 2019

Вот один из вариантов использования group_by в dplyr:

dd %>% group_by(ID, category = event.timeline.ys >= 0) %>% 
  filter(abs(event.timeline.ys) == min(abs(event.timeline.ys))) %>% 
  dplyr::select(-category) %>%
  as.data.frame

  category event.timeline.ys     ID year group
1     TRUE                 0 800033 2010     A
2    FALSE                -1 800033 2011     A
3     TRUE                 0 800076 2008     B
4    FALSE                -1 800076 2009     B
5     TRUE                 1 800100 2018     C
6     TRUE                 0 800125 2008     A
7    FALSE                -1 800125 2009     A
0 голосов
/ 25 апреля 2019

Вот способ сделать это в data.table

library(data.table)
as.data.table(dd)[, .SD[c(last(which(event.timeline.ys >= 0)),
                          first(which(event.timeline.ys < 0)))],
                  by=ID]


       ID event.timeline.ys year group
1: 800033                 0 2010     A
2: 800033                -1 2011     A
3: 800076                 0 2008     B
4: 800076                -1 2009     B
5: 800100                 1 2018     C
6: 800125                 0 2008     A
7: 800125                -1 2009     A
0 голосов
/ 25 апреля 2019

Группируйте по ID, и отрицательный event.timesline.ys. Если оно отрицательное, выберите (slice) первую строку, в противном случае выберите последнюю (т.е. строку n()).

library(dplyr)

dd %>% 
  mutate(neg = event.timeline.ys < 0) %>% 
  group_by(ID, neg) %>% 
  slice(if(neg[1]) 1 else n()) %>% 
  ungroup %>% 
  select(-neg)

# # A tibble: 7 x 4
#   event.timeline.ys     ID  year group
#               <int>  <int> <int> <fct>
# 1                 0 800033  2010 A    
# 2                -1 800033  2011 A    
# 3                 0 800076  2008 B    
# 4                -1 800076  2009 B    
# 5                 1 800100  2018 C    
# 6                 0 800125  2008 A    
# 7                -1 800125  2009 A   
0 голосов
/ 25 апреля 2019

Вот способ извлечь индексы для интересующих вас строк с помощью which() и row_number()

library(dplyr)

dd %>% 
  group_by(ID) %>% 
  filter(row_number() == last(which(event.timeline.ys >= 0)) | 
         row_number() == first(which(event.timeline.ys < 0)))

Я думаю, что это полезно для чтения, аналогично тому, как вы описали то, что выпосле слов так надеюсь, что это имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...