извлечение группы значений на основе значений в другой таблице данных с использованием dplyr - PullRequest
0 голосов
/ 14 мая 2018

Представьте, что у меня есть БОЛЬШАЯ таблица (table1), похожая на приведенную ниже.

ТАБЛИЦА 1:

YEAR     MODEL    MAKE      ORDERCODE  COLOR

2001      BMW     328i      FAE        GREEN
2001      BMW     328i      SDC        BLACK
2001      LEXUS   LS430     ASD        PURPLE
2001      LEXUS   IS300     ASD        BLACK
2001      LEXUS   GS300h    YUK        BLACK
2001      LEXUS   GS300h    HNY        BLUE
2002      LEXUS   GS300h    ASF        PURPLE
2002      LEXUS   GS300h    FAS        BROWN
2002      LEXUS   GS300h    YUI        RED
2002      LEXUS   IS250d    ZXC        ORANGE
2002      LEXUS   IS250d    ASE        BLUE

У меня есть другой фрейм данных, который имеет другую марку (скажем, это Accord, с ЧЕРНЫМ, СИНИМ, ФИОЛЕТОВЫМ и КРАСНЫМ), поэтому он выглядит примерно так:

TABLE2:

MAKE     COLOR
Accord   BLACK
Accord   RED
Accord   BLUE
Accord   PURPLE    

Я пытаюсь найти все машины в ТАБЛИЦЕ1, которые имеют ВСЕ цвета в таблице2. Я попытался использовать dplyr table1 %>% filter(COLOR %in% table2$COLOR), но мне возвращается любая строка, которая имеет хотя бы один из заданных цветов, которые я ищу. Я хотел бы вернуть строки для MAKE автомобиля, который имеет цвета, которые я определяю. Так что мой результат будет примерно таким:

желаемый результат:

2001      LEXUS   GS300h    YUK        BLACK
2001      LEXUS   GS300h    HNY        BLUE
2002      LEXUS   GS300h    ASF        PURPLE
2002      LEXUS   GS300h    FAS        BROWN
2002      LEXUS   GS300h    YUI        RED

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Вот решение, использующее dplyr:

library(dplyr)

df1 %>%
  group_by(MODEL, MAKE) %>%
  mutate(COLOR2 = ifelse(COLOR %in% df2$COLOR, COLOR, NA),
         count = n_distinct(COLOR2[!is.na(COLOR2)])) %>%
  filter(count == nrow(df2)) %>%
  select(-COLOR2, -count)

Результат:

# A tibble: 5 x 5
# Groups:   MODEL, MAKE [1]
   YEAR MODEL   MAKE ORDERCODE  COLOR
  <int> <chr>  <chr>     <chr>  <chr>
1  2001 LEXUS GS300h       YUK  BLACK
2  2001 LEXUS GS300h       HNY   BLUE
3  2002 LEXUS GS300h       ASF PURPLE
4  2002 LEXUS GS300h       FAS  BROWN
5  2002 LEXUS GS300h       YUI    RED
0 голосов
/ 14 мая 2018

(Функция конвейера %>%, а не %<%.) Необходима для создания группировки в TABLE1 на основе как модели, так и модели, а также для изменения направления направления операции %in% в тесте и для добавить логическую all операцию. Вопрос в том, присутствуют ли все цвета во второй таблице в цветах, ограниченных одной группой.

TABLE1 %>% group_by(MODEL, MAKE) %>% filter(all(TABLE2$COLOR %in% COLOR))
# A tibble: 5 x 5
# Groups:   MODEL, MAKE [1]
   YEAR MODEL MAKE   ORDERCODE COLOR 
  <int> <chr> <chr>  <chr>     <chr> 
1  2001 LEXUS GS300h YUK       BLACK 
2  2001 LEXUS GS300h HNY       BLUE  
3  2002 LEXUS GS300h ASF       PURPLE
4  2002 LEXUS GS300h FAS       BROWN 
5  2002 LEXUS GS300h YUI       RED   
0 голосов
/ 14 мая 2018

Чтобы найти наиболее похожие, мы собираемся найти общее количество совпадений цветов для каждой модели, и, наконец, мы выбираем модель с наибольшим совпадением цветов.

dplyr

df %>% 
    group_by(MODEL,MAKE) %>% 
    mutate(slr = sum(df1$COLOR %in% COLOR)) %>% 
    filter(slr == max(slr))

data.table

setDT(df)
df[,slr := sum(df1$COLOR %in% COLOR),.(MODEL,MAKE)]
df = df[slr == max(slr)]
print(df)

Вывод:

   YEAR MODEL   MAKE ORDERCODE  COLOR slr
1: 2001 LEXUS GS300h       YUK  BLACK   4
2: 2001 LEXUS GS300h       HNY   BLUE   4
3: 2002 LEXUS GS300h       ASF PURPLE   4
4: 2002 LEXUS GS300h       FAS  BROWN   4
5: 2002 LEXUS GS300h       YUI    RED   4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...