Как объединить два кадра данных с условными операторами - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть два df Я хочу merge.

df1 выглядит так:

CODE    TAX   PRICE   TOTAL
4577    0.9   99.1    100
8965    NA    25      25
7788    1.5   13.5    15
4021    NA    20      20
6987    0.00  40      40

df1 - это dataframe, содержащий коды, налогстоимость в зависимости от цены и общей (суммы) налогов + цены.

df2 выглядит так:

CODE    TAX.CLASS   MEANING
4577     CLASS1     Car
4577     CLASS2     Car
8965     CLASS1     Internet
2635     CLASS1     Computer
7788     CLASS1     Phone
7788     CLASS2     Phone
1258     CLASS1     Water
4021     CLASS1     Food
6987     CLASS1     Gasoline
6987     CLASS2     Gasoline

, где каждый code отображает tax.class и meaning.Я хотел бы получить вывод, как это:

CODE    MEANING   TAX.CLASS   TAX   PRICE   TOTAL
4577    Car        CLASS2     0.9   99.1    100
8965    Internet   CLASS1     NA    25      25
7788    Phone      CLASS2     1.5   13.5    15
4021    Food       CLASS1     NA    20      20
6987    Gasoline   CLASS1     0.00  40      40

До сих пор я пытался с ответами на эти вопросы:

, но это не сработало так, как я хочу.В основном проблема заключается в match каждые code в df1 с code в df2, но при извлечении CLASS1, если есть значение NA или TAX в df1 <= 0.00, с другойвручную, извлеките CLASS2, если есть значение TAX в df1 > 0.00 на codes, повторенное дважды.

Любые предложения?

Предпочтительно BaseR.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Используя dplyr, мы можем создать TAX.CLASS в df1, а затем left_join.

df1 %>% dplyr::mutate(TAX.CLASS=ifelse(TAX<=0 | is.na(TAX),"CLASS1","CLASS2")) %>%
  dplyr::left_join(df2, by=c("CODE","TAX.CLASS"))

  CODE TAX PRICE TOTAL TAX.CLASS  MEANING
1 4577 0.9  99.1   100    CLASS2      Car
2 8965  NA  25.0    25    CLASS1 Internet
3 7788 1.5  13.5    15    CLASS2    Phone
4 4021  NA  20.0    20    CLASS1     Food
5 6987 0.0  40.0    40    CLASS1 Gasoline
0 голосов
/ 05 февраля 2019

Вы можете сделать:

df1$TAX.CLASS<- ifelse(is.na(df1$TAX) | df1$TAX <= 0.00, "CLASS1", "CLASS2")

df_final <- merge(df1, df2, by = c("CODE", "TAX.CLASS"), all.x = TRUE)

Вывод:

   CODE TAX.CLASS TAX PRICE TOTAL  MEANING
1: 4021    CLASS1  NA  20.0    20     Food
2: 4577    CLASS2 0.9  99.1   100      Car
3: 6987    CLASS1 0.0  40.0    40 Gasoline
4: 7788    CLASS2 1.5  13.5    15    Phone
5: 8965    CLASS1  NA  25.0    25 Internet

Это решение в base, но ту же логику можно применять в любом пакете.

Обратите внимание, что вы также можете использовать with в первом операторе, чтобы избежать ссылки на фрейм данных:

df1$TAX.CLASS<- with(df1, ifelse(is.na(TAX) | TAX <= 0.00, "CLASS1", "CLASS2"))
...