сравнить несколько векторов разной длины - PullRequest
0 голосов
/ 25 октября 2018

Я бы хотел расширить то, что работает с , сравнить несколько векторов разной длины, сосчитать одинаковые элементы и распечатать те, которые одинаковы и различны .Я хотел бы написать цикл, чтобы я мог делать попарные сравнения десяти различных векторов, чтобы найти, что является общим для каждого сравнения, для всех возможных парных опций.Основная часть сравнения приведенного ниже псевдокода работает и из предыдущего поста, но это просто для сравнения A и B, и я хотел бы сравнить A с C, A с #D, B с C и т. Д...

vectors to be compared: A, B, C, D, E, F, G, H, I, J
set global variable for first vector to be compared
set global variable for second vector to be compared

#vetors -- these are subsets of my real vectors, which are more like 50 - 200 elements long
A <- c("866_78", "1137_78", "1721_78", "1745_79", "1910_79", "1972_76", 
        "2776_77",  "3049_79", "3084_15",  "3995_78", "4066_33", "4431_15")
B <- c("866_78", "1137_78", "1721_78", "1745_79", "1910_79", "1972_76", 
       "2776_77",  
       "3049_79", "3084_15",  "3995_78")
C <- c("866_78", "1137_78", "1910_79", "1972_76", "2776_77",  
       "3049_79", "3084_14",  "3995_78", "4066_36", "4431_19", "4885_78")
D <- c("866_78", "1137_78", "1721_78", "1745_79", "1910_79", "1972_76", 
      "2773_77",  
       "3049_79", "3084_12",  "3995_78", "4066_36", "4431_19", "4885_78")
E <- c("866_78", "1137_78", "1721_78", "1745_79", "1910_79", "1972_76", 
      "2776_77",  
       "3049_79", "3084_17", "4431_19", "4885_78")
F <- c("868_78", "1137_78", "1721_78", "1745_79", "1910_79", "1972_76", 
       "2776_77",  
       "3049_79", "3084_15",  "3995_78", "4066_36", "4431_19", "4885_78")
G <- c("866_78", "1837_78", "1721_78", "1972_76", "2776_77",  
       "3049_79", "3084_15",  "3995_78", "4066_36", "4431_19", "4885_78")
H <- c("866_78", "1137_78", "1721_78", "1745_79", "1910_79", "1972_76", 
        "2776_77",  
       "3049_79", "3084_15",  "3995_78", "4066_36", "4431_19", "4885_78")
I <- c("866_78", "1137_28", "1721_78", "1745_79", "1910_79", "1972_76", 
       "2776_77",  
       "3995_78", "4066_36", "4431_19", "4885_78")
J <- c("866_78", "1137_78", "1721_78", "1745_79", "1910_79", "1972_76", 
       "2776_77",  
       "3049_79", "3084_18",  "3995_78", "4066_36", "4431_19", "4885_78")

for(i ???)
{
compare.SNPs <- function(A, B) {
  # consider only unique names
  A.u <- unique(A)
  B.u <- unique(B)
  common.A.B <- intersect(A.u, B.u)
  diff.A.B <- setdiff(A.u, B.u)
  diff.B.A <- setdiff(B.u, A.u)
  uncommon.A.B <- union(diff.A.B, diff.B.A)
  cat(paste0("The sets have ", length(common.A.B), " SNPs in common:"))
  print(common.A.B)
  print(paste0("The sets have ", length(uncommon.A.B), " SNPs not in 
  common:"))
  print(paste0("In the first set, but not in the second set:"))
  print(diff.A.B)
  print(paste0("Not in the first set, but in the second set:"))
  print(diff.B.A)

}
compare.SNPs(A,B)
}

Будем весьма благодарны за любые указания, например, на пример кода.

С уважением, Элла

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Сначала вы должны сказать своей функции compare.SNPs, чтобы дать вам что-то ... ну ... в return вместо простой печати.Это делается с помощью return(list(common.A.B, diff.A.B, diff.B.A))

compare.SNPs <- function(A, B) {
  # consider only unique names
  A.u <- unique(A)
  B.u <- unique(B)
  common.A.B <- intersect(A.u, B.u)
  diff.A.B <- setdiff(A.u, B.u)
  diff.B.A <- setdiff(B.u, A.u)
  uncommon.A.B <- union(diff.A.B, diff.B.A)
  cat(paste0("The sets have ", length(common.A.B), " SNPs in common:"))
  print(common.A.B)
  print(paste0("The sets have ", length(uncommon.A.B), " SNPs not in 
               common:"))
  print(paste0("In the first set, but not in the second set:"))
  print(diff.A.B)
  print(paste0("Not in the first set, but in the second set:"))
  print(diff.B.A)
  return(list(common.A.B, diff.A.B, diff.B.A))
}

Так что теперь эта функция будет return list с 3 элементами: общие элементы двух векторов, а затем 2 набора различий.

mylist <- list(A, B, C, D, E, F, G, H, I, J)
allcomparisons <- list()
for(i in 1:length(mylist))
{
  for(j in 1:length(mylist)) {
    allcomparisons <- c(allcomparisons, compare.SNPs(mylist[[i]], mylist[[j]]))
  }
}

Сравнение A с J сравнивает 10x10 элементов, что даст вам всего 300 элементов: сначала общие элементы A и A, затем разницу между A и A, затем снова разницу между A и A,затем общие элементы A и B и так далее.Затем вы можете получить доступ к элементам allcomparisons, как и любой другой список.Например, вы можете проверить, что all(allcomparisons[[4]]==compare.SNPs(A,B)[[1]])

[1] TRUE
0 голосов
/ 25 октября 2018
xx<-combn(LETTERS[1:10],2)
for (i in 1:dim(xx)[2]) {
      cat(paste0("Comparing ", xx[1,i], " and ", xx[2,i],": "))
      compare.SNPs(get(xx[1,i]),get(xx[2,i]))
    }

(Кроме того, нет причины для вызова function() внутри цикла for).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...