我想创建一个有效的ifelse语句,这样如果来自df2的列与df1中的列匹配,那么df2中的该行将以特定方式编码。我的代码有效,但效率很低。
示例数据:
DF1
A B C 111 2 1 111 5 2 111 7 3 112 2 4 112 8 5 113 2 6
DF2
一个B. 112 2 111 2 113 2 111 5 111 7 112 8
期望的结果:
DF2
A B C 112 2 4 111 2 1 113 2 6 111 5 2 111 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,这样每个组合都不必手动输入?
这通常通过连接完成。来自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