使用过滤器和逻辑运算

时间:2019-07-11 16:10:43

标签: r dplyr tidyverse

我正在尝试编写代码,但无法获得结果。我正在使用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个会议的观测值,但是在第2个会议之前却无法先达到第1个会议。

这是我写的代码:

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

2 个答案:

答案 0 :(得分:0)

首先,我们确保会议栏目具有特色,而不是要素。然后,我们将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)

答案 1 :(得分:0)

另一种可能是:

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