创建一个数据框,其中包含R中顺序不重要的2个变量的成对比较。

huangapple go评论94阅读模式
英文:

Create a data frame with pairwise comparisons of 2 variables where order don't matter in R

问题

Sure, here's the translated code portion:

  1. 我有一些变量,想要进行两两比较,但要移除那些相等的行(例如,“A == A”),只保留其中一个比较,其中仅顺序发生变化,因此保留“A vs B”或“B vs A”。
  2. 我有以下R代码可以完成这个任务:
  3. sp.all.var = c(LETTERS[1:10])
  4. length(sp.all.var)^2
  5. df.pairwise = expand.grid(sp.all.var, sp.all.var)
  6. nrow(df.pairwise)
  7. df.pairwise.sub1 = df.pairwise[df.pairwise$Var1 != df.pairwise$Var2,]
  8. df.pairwise.sub1$compare = apply(df.pairwise.sub1, 1, function(x) paste(sort(x), collapse = "-"))
  9. nrow(df.pairwise.sub1)
  10. df.pairwise.sub2 = df.pairwise.sub1[!duplicated(df.pairwise.sub1$compare), ]
  11. nrow(df.pairwise.sub2)

Please note that the code retains its original structure and comments for clarity.

英文:

I have variables that I want to make all pairwise comparisons but removing rows where the comparisons are equal (e.g., "A" == "A") and keep only one of the comparisons where only the order change, so keep "A" vs "B" OR "B" vs "A".

I have this code that does it in R:

  1. sp.all.var = c(LETTERS[1:10])
  2. length(sp.all.var)^2
  3. df.pairwise = expand.grid(sp.all.var,sp.all.var)
  4. nrow(df.pairwise)
  5. df.pairwise.sub1 = df.pairwise[df.pairwise$Var1!=df.pairwise$Var2,]
  6. df.pairwise.sub1$compare = apply(df.pairwise.sub1, 1, function(x) paste(sort(x), collapse = "-"))
  7. nrow(df.pairwise.sub1)
  8. df.pairwise.sub2 = df.pairwise.sub1[!duplicated(df.pairwise.sub1$compare), ]
  9. nrow(df.pairwise.sub2)

I was wondering if there is a way to do it in a simpler fashion (Is there a built in function that does it? is there a package?).

答案1

得分: 2

You probably want combn.

combn(LETTERS[1:10], 2, paste, collapse = "-")
#> [1] "A-B" "A-C" "A-D" "A-E" "A-F" "A-G" "A-H" "A-I" "A-J" "B-C" "B-D" "B-E"
#> [13] "B-F" "B-G" "B-H" "B-I" "B-J" "C-D" "C-E" "C-F" "C-G" "C-H" "C-I" "C-J"
#> [25] "D-E" "D-F" "D-G" "D-H" "D-I" "D-J" "E-F" "E-G" "E-H" "E-I" "E-J" "F-G"
#> [37] "F-H" "F-I" "F-J" "G-H" "G-I" "G-J" "H-I" "H-J" "I-J"

Or as a data.frame:

as.data.frame(t(combn(LETTERS[1:10], 2, (x) c(x, paste(x, collapse = "-")))))
#> V1 V2 V3
#> 1 A B A-B
#> 2 A C A-C
#> 3 A D A-D
#> 4 A E A-E
#> 5 A F A-F
#> 6 A G A-G
#> 7 A H A-H
#> 8 A I A-I
#> 9 A J A-J
#> 10 B C B-C
#> 11 B D B-D
#> 12 B E B-E
#> 13 B F B-F
#> 14 B G B-G
#> 15 B H B-H
#> 16 B I B-I
#> 17 B J B-J
#> 18 C D C-D
#> 19 C E C-E
#> 20 C F C-F
#> 21 C G C-G
#> 22 C H C-H
#> 23 C I C-I
#> 24 C J C-J
#> 25 D E D-E
#> 26 D F D-F
#> 27 D G D-G
#> 28 D H D-H
#> 29 D I D-I
#> 30 D J D-J
#> 31 E F E-F
#> 32 E G E-G
#> 33 E H E-H
#> 34 E I E-I
#> 35 E J E-J
#> 36 F G F-G
#> 37 F H F-H
#> 38 F I F-I
#> 39 F J F-J
#> 40 G H G-H
#> 41 G I G-I
#> 42 G J G-J
#> 43 H I H-I
#> 44 H J H-J
#> 45 I J I-J

英文:

You probably want combn.

  1. combn(LETTERS[1:10], 2, paste, collapse = "-")
  2. #> [1] "A-B" "A-C" "A-D" "A-E" "A-F" "A-G" "A-H" "A-I" "A-J" "B-C" "B-D" "B-E"
  3. #> [13] "B-F" "B-G" "B-H" "B-I" "B-J" "C-D" "C-E" "C-F" "C-G" "C-H" "C-I" "C-J"
  4. #> [25] "D-E" "D-F" "D-G" "D-H" "D-I" "D-J" "E-F" "E-G" "E-H" "E-I" "E-J" "F-G"
  5. #> [37] "F-H" "F-I" "F-J" "G-H" "G-I" "G-J" "H-I" "H-J" "I-J"

Or as a data.frame:

  1. as.data.frame(t(combn(LETTERS[1:10], 2, \(x) c(x, paste(x, collapse = "-")))))
  2. #> V1 V2 V3
  3. #> 1 A B A-B
  4. #> 2 A C A-C
  5. #> 3 A D A-D
  6. #> 4 A E A-E
  7. #> 5 A F A-F
  8. #> 6 A G A-G
  9. #> 7 A H A-H
  10. #> 8 A I A-I
  11. #> 9 A J A-J
  12. #> 10 B C B-C
  13. #> 11 B D B-D
  14. #> 12 B E B-E
  15. #> 13 B F B-F
  16. #> 14 B G B-G
  17. #> 15 B H B-H
  18. #> 16 B I B-I
  19. #> 17 B J B-J
  20. #> 18 C D C-D
  21. #> 19 C E C-E
  22. #> 20 C F C-F
  23. #> 21 C G C-G
  24. #> 22 C H C-H
  25. #> 23 C I C-I
  26. #> 24 C J C-J
  27. #> 25 D E D-E
  28. #> 26 D F D-F
  29. #> 27 D G D-G
  30. #> 28 D H D-H
  31. #> 29 D I D-I
  32. #> 30 D J D-J
  33. #> 31 E F E-F
  34. #> 32 E G E-G
  35. #> 33 E H E-H
  36. #> 34 E I E-I
  37. #> 35 E J E-J
  38. #> 36 F G F-G
  39. #> 37 F H F-H
  40. #> 38 F I F-I
  41. #> 39 F J F-J
  42. #> 40 G H G-H
  43. #> 41 G I G-I
  44. #> 42 G J G-J
  45. #> 43 H I H-I
  46. #> 44 H J H-J
  47. #> 45 I J I-J

答案2

得分: 1

以下是翻译好的部分:

  1. 你还可以使用 `rep` + `sequence` 来实现它
英文:

You can also make it with rep + sequence

  1. x <- LETTERS[1:10]
  2. paste0(
  3. rep(x, (length(x) - 1):0), "-",
  4. x[sequence((length(x) - 1):0, from = 2:length(x))]
  5. )

which gives

  1. [1] "A-B" "A-C" "A-D" "A-E" "A-F" "A-G" "A-H" "A-I" "A-J" "B-C" "B-D" "B-E"
  2. [13] "B-F" "B-G" "B-H" "B-I" "B-J" "C-D" "C-E" "C-F" "C-G" "C-H" "C-I" "C-J"
  3. [25] "D-E" "D-F" "D-G" "D-H" "D-I" "D-J" "E-F" "E-G" "E-H" "E-I" "E-J" "F-G"
  4. [37] "F-H" "F-I" "F-J" "G-H" "G-I" "G-J" "H-I" "H-J" "I-J"

huangapple
  • 本文由 发表于 2023年8月5日 00:34:01
  • 转载请务必保留本文链接:https://go.coder-hub.com/76837754.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定