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

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

Я хотел бы сказать dplyr, пожалуйста, group_by "team" и отфильтруйте строки каждой команды, которые содержат имя "LT". Если команда не содержит названия «LT», то отфильтруйте имя «CH».

Я бы хотел, чтобы мой data.frame выглядел так.

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

Любая помощь высоко ценится

5
LDT 10 Ноя 2020 в 21:27

2 ответа

Лучший ответ

Один из вариантов dplyr может быть:

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 
2
tmfmnk 10 Ноя 2020 в 18:32

Мы можем сначала arrange, а затем filter на основе значения first в 'name' после группировки по '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))
1
akrun 11 Ноя 2020 в 00:03