如何使用条件语句合并两个数据框
How to merge two dataframes with conditional statements
我有两个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
到目前为止,我已经尝试了这些问题的答案:
- How to join (merge) data frames (inner, outer, left, right)?
- Merge Dataframe with conditional statements in R
但它并没有像我想要的那样工作。问题基本上是 match
df1
中的每个 code
与 df2
中的 code
但如果有 NA
则检索 CLASS1
或 df1 <= 0.00
中的 TAX
值,另一方面,如果 codes
上的 df1 > 0.00
中有重复两次的 TAX
值,则检索 CLASS2
.
有什么建议吗?
最好是BaseR
.
你可以这样做:
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"))
使用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
我有两个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
到目前为止,我已经尝试了这些问题的答案:
- How to join (merge) data frames (inner, outer, left, right)?
- Merge Dataframe with conditional statements in R
但它并没有像我想要的那样工作。问题基本上是 match
df1
中的每个 code
与 df2
中的 code
但如果有 NA
则检索 CLASS1
或 df1 <= 0.00
中的 TAX
值,另一方面,如果 codes
上的 df1 > 0.00
中有重复两次的 TAX
值,则检索 CLASS2
.
有什么建议吗?
最好是BaseR
.
你可以这样做:
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"))
使用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