Использование фильтра и логической операции - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь написать код, но мне не удалось достичь результата.Я использую фильтр от Tidyverse.Я новичок в R, так что это сложно.

Это форма фрейма данных:

ID  Meeting1    Meeting2
P40 Yes         NA
P40 Yes         NA
P40 NA          Yes
P42 NA          Yes
P43 NA          Yes
P44 Yes         NA
P44 NA          Yes

Я пытаюсь написать код, который фильтрует Id и находит наблюдение, которое было на встрече 2, но не может перейти насначала встретиться с 1, прежде чем идти навстречу 2.

Это код, который я написал:

tt %>% group_by(ID) %>% filter(Meeting1 == "Yes" | Meeting2 == "Yes")

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Другая возможность может быть:

df %>%
 group_by(ID) %>% 
 filter(any(cumsum(!is.na(Meeting1)) == 0 & cumsum(!is.na(Meeting2)) == 1))

  ID    Meeting1 Meeting2
  <chr> <chr>    <chr>   
1 P42   <NA>     Yes     
2 P43   <NA>     Yes   
0 голосов
/ 11 июля 2019

Сначала мы удостоверимся, что столбцы собрания не символ, а символЗатем мы заменим NA на более полезный "No", а затем мы filter:

dd %>% 
  group_by(ID) %>% 
  mutate_at(vars(starts_with("Meeting")), as.character) %>%
  mutate_at(vars(starts_with("Meeting")), ~ifelse(is.na(.), "No", .)) %>% 
  filter(any(Meeting2 == "Yes") & !any(Meeting1 == "Yes"))
# # A tibble: 2 x 3
# # Groups:   ID [2]
#   ID    Meeting1 Meeting2
#   <fct> <chr>    <chr>   
# 1 P42   No       Yes     
# 2 P43   No       Yes  

. Работаем с этими примерами данных:

  dd = read.table(text = 'ID  Meeting1    Meeting2
P40 Yes         NA
P40 Yes         NA
P40 NA          Yes
P42 NA          Yes
P43 NA          Yes
P44 Yes         NA
P44 NA          Yes', header = T)
...