【问题标题】:all combinations of two and remove if they are same in R两者的所有组合,如果它们在 R 中相同,则删除
【发布时间】:2014-06-12 22:28:19
【问题描述】:

我希望您能了解一下这个例子。我需要拥有两个向量的所有组合,如果它们相同则删除,如果重复则删除一份。

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 步。如果有倒数组合,请删除它。例如 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"

谢谢

【问题讨论】:

  • 试试matrix(sort(unique(as.vector(z))), ncol=1),或者只是sort(unique(as.vector(z))),这取决于你真正需要什么。
  • 这两个值的顺序对最终结果有影响吗?
  • 你不觉得很遗憾你没有构建一个包含任何 AS/AZ、AZ/AS 组合的测试用例吗?您能否解释一下为什么在您的示例中“AL/AZ、AS/AZ、KS/AZ、MO/AZ 重复”?
  • Flick 先生:排序后的最终结果有帮助!
  • BondedDust:是的,在示例中我没有包含测试用例。对不起。 AL/AZ、AS/AZ、KS/AZ、MO/AZ 重复,因为在 V1 和 v2 中都存在“AZ”

标签: r vector combinations duplication


【解决方案1】:

如果两个值的顺序在最终结果中无关紧要,那么这应该可以工作

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"

【讨论】:

    【解决方案2】:

    这是使用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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-09
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多