两个的所有组合,如果它们在R中相同则删除

时间:2014-06-12 22:28:20

标签: r vector combinations duplication

我想在这个例子中体验你。我需要拥有两个向量的所有组合,如果它们相同则删除它们,如果它们是重复的,则删除一个副本。

v1 <- c("AS", "KS", "AZ", "AL", "MO")
v2 <- c("AZ", "KZ", "LM", "AZ", "ZK")

我想得到v1 / v2的组合而我不想要互惠的V2 / V1,所以我用

z<-outer(v1,v2, paste, sep="/") 

给了我

      [,1]    [,2]    [,3]    [,4]    [,5]   
[1,] "AS/AZ" "AS/KZ" "AS/LM" "AS/AZ" "AS/ZK"
[2,] "KS/AZ" "KS/KZ" "KS/LM" "KS/AZ" "KS/ZK"
[3,] "AZ/AZ" "AZ/KZ" "AZ/LM" "AZ/AZ" "AZ/ZK"
[4,] "AL/AZ" "AL/KZ" "AL/LM" "AL/AZ" "AL/ZK"
[5,] "MO/AZ" "MO/KZ" "MO/LM" "MO/AZ" "MO/ZK"

但我需要修改以适应我的分析

步骤1.删除相同的组合。我不需要拥有相同的组合。在上面的例子中,有两次AZ / AZ,两者都应该被删除。

步骤2.删除重复的组合。我不需要重复。在上面的例子中,AL / AZ,AS / AZ,KS / AZ,MO / AZ是重复的。应删除一份副本。

步骤3.删除receprocal组合(如果有)。例如,AZ / AS与AS / AZ相同。

步骤3.对所有进行排序并将它们保存在单列中。

"AL/AZ"
"AL/KZ"
"AL/LM"
"AL/ZK"
"AS/AZ"
"AS/KZ"
"AS/LM"
"AS/ZK"
"AZ/KZ"
"AZ/LM"
"AZ/ZK"
"KS/AZ"
"KS/KZ"
"KS/LM"
"KS/ZK"
"MO/AZ"
"MO/KZ"
"MO/LM"
"MO/ZK"

由于

2 个答案:

答案 0 :(得分:3)

如果两个值的顺序在最终结果中无关紧要,那么这应该有效

v1 <- c("AS", "KS", "AZ", "AL", "MO")
v2 <- c("AZ", "KZ", "LM", "AZ", "ZK")
vv <- sort(unique(c(v1,v2)))

f1 <- as.numeric(factor(v1, levels=vv))
f2 <- as.numeric(factor(v2, levels=vv))
ff <- expand.grid(f1, f2)
ok <- unique(t(apply(subset(ff, Var1 != Var2), 1, sort)))

comb <- paste(vv[ok[,1]], vv[ok[,2]],sep="/")

产生

 [1] "AS/AZ" "AZ/KS" "AL/AZ" "AZ/MO" "AS/KZ" "KS/KZ" "AZ/KZ" "AL/KZ" "KZ/MO"
[10] "AS/LM" "KS/LM" "AZ/LM" "AL/LM" "LM/MO" "AS/ZK" "KS/ZK" "AZ/ZK" "AL/ZK"
[19] "MO/ZK"

答案 1 :(得分:1)

这是使用igraph库的另一种可能策略。

library(igraph)
v1 <- c("AS", "KS", "AZ", "AL", "MO")
v2 <- c("AZ", "KZ", "LM", "AZ", "ZK")
gg<-graph.data.frame(expand.grid(v1,v2), directed=F)
ss<-simplify(gg)
apply(get.edgelist(ss),1, paste, collapse="/")

基本上我们使用所有逻辑,如果这个图形库定义你想要的值作为节点,然后在两个集合之间建立所有连接。使用简化可以删除连接到自身的节点,还可以删除节点之间的冗余连接。使用这样的包可能有点不正统,但你可以看到它相对简单。输出:

 [1] "AS/AZ" "AS/KZ" "AS/LM" "AS/ZK" "KS/AZ" "KS/KZ" "KS/LM"
 [8] "KS/ZK" "AZ/AL" "AZ/MO" "AZ/KZ" "AZ/LM" "AZ/ZK" "AL/KZ"
[15] "AL/LM" "AL/ZK" "MO/KZ" "MO/LM" "MO/ZK"