Filtern Sie "entweder" "oder" mit dplyr

Nov 11 2020

Ich habe einen data.frame, der so aussieht.

dat1=data.frame(time=c(1,2,1,2,1,2,1,2), team=c("A","A","A","A","B","B","C","C"), name=c("LT","LT","CH","CH","CH","CH","AT","AT"))

time team name
 1    A     LT
 2    A     LT
 1    A     CH
 2    A     CH
 1    B     CH
 2    B     CH
 1    C     AT
 2    C     AT

Ich möchte zu dplyr sagen, bitte group_by "team" und die Zeilen jedes Teams filtern, das den Namen "LT" enthält. Wenn ein Team den Namen "LT" nicht enthält, filtern Sie den Namen "CH" ein.

Ich möchte, dass mein data.frame so aussieht.

time team name
 1    A     LT
 2    A     LT
 1    B     CH
 2    B     CH

Jede Hilfe wird sehr geschätzt

Antworten

2 tmfmnk Nov 11 2020 at 01:32

Eine dplyrOption könnte sein:

dat1 %>%
 group_by(team) %>%
 filter(if(any(name == "LT")) name == "LT" else name == "CH")

   time team  name 
  <dbl> <fct> <fct>
1     1 A     LT   
2     2 A     LT   
3     1 B     CH   
4     2 B     CH 
1 akrun Nov 11 2020 at 07:03

Wir können arrangezuerst und dann filterbasierend auf dem firstWert in 'Name' nach Gruppierung nach 'Team'

library(dplyr)
dat1 %>% 
     filter(name %in% c("LT", "CH")) %>% 
     arrange(team, ordered(name, levels = c('LT', 'CH'))) %>% 
     group_by(team) %>%
     filter(name %in% first(name))