我有两个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
。
你可以这样做:
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