我想在这个例子中体验你。我需要拥有两个向量的所有组合,如果它们相同则删除它们,如果它们是重复的,则删除一个副本。
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"
由于
答案 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"