R 如何使用条件语句合并两个数据帧
我有两个R 如何使用条件语句合并两个数据帧,r,dataframe,merge,conditional,R,Dataframe,Merge,Conditional,我有两个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 CODE TAX.CLASS MEANING 4577 CLASS1 Car 4577 CLASS2
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
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 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
df1
是一个dataframe
包含代码、取决于价格的税收成本以及税收+价格的总和
df2
如下所示:
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
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 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
其中每个code
显示一个tax.class
和含义
。
我希望得到如下输出:
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
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 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
到目前为止,我已经尝试了以下问题的答案:
df1
中的每一个代码
与df2
中的代码
进行匹配,但如果代码
上的df1 0.00
中存在NA
或税务
值,则检索CLASS1
重复两次
有什么建议吗
最好是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)
这是base
中的解决方案,但相同的逻辑可以应用于任何包中
请注意,您也可以在第一条语句中使用with
,以避免引用数据框:
df1$TAX.CLASS<- with(df1, ifelse(is.na(TAX) | TAX <= 0.00, "CLASS1", "CLASS2"))
df1$TAX.CLASS您可以执行以下操作:
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)
这是base
中的解决方案,但相同的逻辑可以应用于任何包中
请注意,您也可以在第一条语句中使用with
,以避免引用数据框:
df1$TAX.CLASS<- with(df1, ifelse(is.na(TAX) | TAX <= 0.00, "CLASS1", "CLASS2"))
df1$TAX.CLASS使用dplyr
,我们可以在df1
中创建一个TAX.CLASS,然后left\u 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
df1%>%dplyr::mutate(TAX.CLASS=ifelse(TAX%)
dplyr::left_join(df2,by=c(“CODE”,“TAX.CLASS”))
代码税价格总税.CLASS含义
14577 0.9 99.1 100二级车
28965 NA 25.0 25 CLASS1互联网
37788 1.513.515 2类电话
44021 NA 20.0 20类食品
56987 0.040.040一级汽油
使用dplyr
,我们可以在df1
中创建一个TAX.CLASS,然后left\u 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
df1%>%dplyr::mutate(TAX.CLASS=ifelse(TAX%)
dplyr::left_join(df2,by=c(“CODE”,“TAX.CLASS”))
代码税价格总税.CLASS含义
14577 0.9 99.1 100二级车
28965 NA 25.0 25 CLASS1互联网
37788 1.513.515 2类电话
44021 NA 20.0 20类食品
56987 0.040.040一级汽油
没有“值”列。你指的是什么?我是说,df1
中的TAX
值。没有“值”列。你指的是什么?我是说,df1
中的TAX
值。