如何合并两个dataframes与条件语句

问题描述 投票:0回答:2

我有两个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.classmeaning。我想获得的输出是这样的:

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

到目前为止,我已经尝试与这些问题的答案:

但它并没有当过我想要的。这个问题基本上是matchcodedf1codedf2但检索CLASS1如果NATAX一个df1 <= 0.00值,而另一方面,检索CLASS2如果在TAX一个df1 > 0.00值上codes重复两次。

有什么建议么?

优选BaseR

r dataframe merge conditional
2个回答
2
投票

你可以这样做:

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"))

1
投票

使用dplyr,我们可以创建一个df1 TAX.CLASS,然后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
© www.soinside.com 2019 - 2024. All rights reserved.