Фильтрация по нескольким критериям для аккуратных данных - PullRequest
0 голосов
/ 25 февраля 2020

Я борюсь с функцией фильтра (dplyr) на аккуратном фрейме данных:

data1<-data.frame("Time"=c(0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5),
                  "Variable"=rep(c("a","b","c","d"),6),
                  "Value"=c(0,1,0,0,1,1,1,1,1,3,2,3,10,1,3,7,2,1,4,2,3,1,5,13))

Я хочу отфильтровать время, когда переменная "a" равна 2, а когда переменная «а» - это как макс. Для первого случая mi код:

data1<-data1%>%
  group_by(Time)%>%
  filter(any(Variable=="a" & Value==2))

и работает нормально и дает мне:

Time Variable Value
2    a        2 
2    b        1
2    c        4
2    d        2

Не сейчас, как могло бы быть для = max (a), я пытался с :

data1<-data1%>%
  group_by(Time)%>%
  filter(any(Variable=="a" & Value==max(Value)))

, но не работает (потому что max рассчитывается для всей переменной столбца) Я думаю, мне нужно что-то вроде Value = max (Value) [Variable $ a]. Фильтрованный должен действовать следующим образом:

Time Variable Value
3    a        10 
3    b        1
3    c        3
3    d        7

Я предпочитаю решение с dplyr. Может ли кто-нибудь дать мне общее правило для фильтрации на tidy df с несколькими критериями?

Ответы [ 3 ]

1 голос
/ 25 февраля 2020

Вот способ dplyr:

library(dplyr)
data1%>%
  filter(Time == Time[Value == max(Value[Variable == "a"])])

И способ data.table

library(data.table)
setDT(data1)
data1[Time == Time[Value == max(Value[Variable == "a"])]]
1 голос
/ 25 февраля 2020

дополнительная опция

data1 %>% 
  filter(Variable == "a") %>% 
  filter(Value == max(Value, na.rm = T)) %>% 
  select(Time) %>% 
  left_join(., data1, by = "Time")
0 голосов
/ 25 февраля 2020

На основании отредактированных критериев это должно обеспечить желаемые результаты.

data1 <- data1 %>%
         group_by(Time) %>%
         filter(any(Variable=="a" & 
                    Value==max(data1$Value[data1$Variable == 'a'])))
...