Поиск строк по условию - PullRequest
0 голосов
/ 15 января 2019

Я новичок в R и у меня возникли проблемы с этим конкретным запросом

Я хочу найти людей, у которых был тип 1 раньше (заказ), имеющих тип 2 (и они должны иметь оба типа)

Person | type | order
A1     | 1    | 1
A1     | 1    | 2 
A2     | 2    | 3
A2     | 1    | 4
A2     | 2    | 5 
A3     | 1    | 6
A4     | 1    | 7
A4     | 2    | 8
A5     | 1    | 9
A5     | 1    | 10
A5     | 2    | 11

В этом примере в качестве ответа я бы взял A4 и A5.

1 Ответ

0 голосов
/ 15 января 2019

Вы можете создать flag для определения Person, где type == 1 встречается до type == 2.

library(dplyr)

df %>%
  group_by(Person) %>%
  summarise(flag = which.max(type == 1) < which.max(type == 2))

# Person     flag 
#  <fct>     <lgl>
#1  A1      FALSE
#2  A2      FALSE
#3  A3      FALSE
#4  A4      TRUE 
#5  A5      TRUE 

Использование той же логики с базой R aggregate

df1 <- aggregate(type~Person, df, function(x) which.max(x == 1) < which.max(x == 2))

df1
# Person  type
#1 A1      FALSE
#2 A2      FALSE
#3 A3      FALSE
#4 A4       TRUE
#5 A5       TRUE

Вы могли бы затем подмножество type, чтобы получить People

df1$Person[df1$type]
#[1] "A4"  "A5"

Другой подход с использованием базы R ave

unique(df$Person[as.logical(with(df, 
   ave(type, Person, FUN = function(x) which.max(x == 1) < which.max(x == 2))))])
#[1] "A4" "A5"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...