R:跨多个数据框的ifelse循环

时间:2019-04-23 22:50:19

标签: r loops dataframe if-statement

我想创建一个有效的ifelse语句,以便如果df2中的列与df1中的列匹配,那么df2中的该行将以特定方式编码。我的代码有效,但是效率很低。

示例数据:

Df1

A B B C
111 2 1 1
111 5 5 2 2
111 7 7 3
112 2 2 4
112 8 8 5
113 2 2 6

Df2

A B B
112 2
111 2
113 2
111 5
111 <7 />
112

所需结果:

Df2

A B B C
112 2 2 4
111 2 1 1
113 2 2 6
111 5 5 2 2
111 7 7 3
112,8,5

我要做的是:
Df2$C<- ifelse(Df2$A == 111 & Df2$B == 2, 1, 0)
Df2$C<- ifelse(Df2$A == 111 & Df2$B == 5, 2, 0)
Df2$C<- ifelse(Df2$A == 111 & Df2$B == 7, 3, 0) ...

这有效,但是有没有办法使df2可以引用df1中的列并创建列df2 $ C,这样就不必手动键入每个组合了?

1 个答案:

答案 0 :(得分:2)

通常使用联接来完成。 left_join中的dplyr将第一个表中的每一行与第二个表中的每个匹配行连接起来。

https://dplyr.tidyverse.org/reference/join.html

library(dplyr)
Df2 %>% left_join(Df1)

Joining, by = c("A", "B")
    A B C
1 112 2 4
2 111 2 1
3 113 2 6
4 111 5 2
5 111 7 3
6 112 8 5

来自基数R的

merge会给出相似的结果,但是如果不进行一些额外的争吵,就不会保持原始行顺序。

Merge two data frames while keeping the original row order

merge(Df2, Df1)
    A B C
1 111 2 1
2 111 5 2
3 111 7 3
4 112 2 4
5 112 8 5
6 113 2 6