我想创建一个有效的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,这样就不必手动键入每个组合了?
答案 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
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