R 在每行的列值中搜索重复项/逐行比较列值

R 在每行的列值中搜索重复项/逐行比较列值,r,duplicates,dataframe,data.table,dplyr,R,Duplicates,Dataframe,Data.table,Dplyr,我有一个非常大的DF,结构如下: route_1 route_2 route_3 route_4 route_grey_1 route_grey_2 A B NA NA NA NA A B C NA A NA A B C D A D A B C NA

我有一个非常大的DF,结构如下:

route_1 route_2 route_3 route_4 route_grey_1 route_grey_2
A       B       NA      NA      NA           NA
A       B       C       NA      A            NA
A       B       C       D       A            D 
A       B       C       NA      C            NA
B       C       E       F       B            C
但是,
A、B、C、D在行之间将不同。
对于每一行,我都试图找到route_1到route_4的两个值,这两个值在route_Gray_1和route_Gray_2中没有提到。
这将始终正好是2个值。(如果route\n中只有两个值,则不会有route\u Gray\n值,如果route\n中有三个值,则route\u Gray\n中正好有一个值,以此类推。)

因此,上述输入应导致此输出(添加两个新列:

route_1 route_2 route_3 route_4 route_grey_1 route_grey_2  result1 result2 
A       B       NA      NA      NA           NA            A       B  
A       B       C       NA      A            NA            B       C
A       B       C       D       A            D             B       C  
A       B       C       NA      C            NA            A       B
B       C       E       F       B            C             E       F
到目前为止,我想到的唯一解决方案是编写一个函数,在所有行中循环,并将一个接一个的route\n与route\u grey\n进行比较。 首先,我认为可能有一个更好的解决方案,我希望循环非常慢。其次,我无法使我的循环工作,所以如果你认为这可能是唯一的解决方案,希望有人能帮助我

/e:虽然David的答案适用于小型DF,但我的数据确实需要30分钟,并且失败了:

Error: cannot allocate vector of size 380 Kb
Error during wrapup: cannot allocate vector of size 438 Kb
我怀疑应该有一个使用dplyr或data.table包的解决方案

/e2:在玩过dplyr之后,我找到了一个解决方案。它似乎可以工作,并且在我的DF上花费了约30秒。但是它非常粗糙,可能不是一个很好的DF。因此,非常感谢任何改进。下面是我的代码:

df <- df %>% group_by(index) %>%
mutate( c_route1 = !route_1 %in% c(route_grey_1,route_grey_2),
c_route2 = !route_2 %in% c(route_grey_1,route_grey_2),
c_route3 = !route_3 %in% c(route_grey_1,route_grey_2),
c_route4 = !route_4 %in% c(route_grey_1,route_grey_2))
df%分组依据(索引)%>%
变异(c_路由1=!路由1%在%c中(路由灰路由1,路由灰路由2),
c_路线2=!路线2%位于%c中(路线1,路线2),
c_路线3=!路线3%位于%c中(路线1为灰色,路线2为灰色),
c_路线4=!路线4%位于%c中(路线灰_1,路线灰_2))
这将在df中创建带有逻辑的列,然后它变得丑陋(可能这部分可以做得更好,希望看到一些替代方案):


df$result1[df$c_route1]尽管我尽量避免
apply
,但这是我能想到的唯一解决方案

DF[c("result1", "result2")] <- t(apply(DF, 1, function(x) x[1:4][t(!(x[1:4] %in% x[5:6]))]))

#   route_1 route_2 route_3 route_4 route_grey_1 route_grey_2 result1 result2
# 1       A       B    <NA>    <NA>         <NA>         <NA>       A       B
# 2       A       B       C    <NA>            A         <NA>       B       C
# 3       A       B       C       D            A            D       B       C
# 4       A       B       C    <NA>            C         <NA>       A       B
# 5       B       C       E       F            B            C       E       F

DF[c(“result1”、“result2”)]这正是我想要的,谢谢。你能解释一下代码吗?我不完全理解。而且,正如循环/应用方法所期望的那样,它非常慢。代码非常简单。它检查每一行,检查
DF[I,1:4]
中的哪些条目不在
DF[I,5:6]
中,然后打印这些值。
DF[c("result1", "result2")] <- t(apply(DF, 1, function(x) x[1:4][t(!(x[1:4] %in% x[5:6]))]))

#   route_1 route_2 route_3 route_4 route_grey_1 route_grey_2 result1 result2
# 1       A       B    <NA>    <NA>         <NA>         <NA>       A       B
# 2       A       B       C    <NA>            A         <NA>       B       C
# 3       A       B       C       D            A            D       B       C
# 4       A       B       C    <NA>            C         <NA>       A       B
# 5       B       C       E       F            B            C       E       F