R 在每行的列值中搜索重复项/逐行比较列值
我有一个非常大的DF,结构如下: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
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