Как найти все возможные комбинации уникальных векторных пересечений между несколькими (6) векторами различной длины в R - PullRequest
2 голосов
/ 26 сентября 2019

У меня есть набор из 6 векторов разной длины (названия столбцов: tp1-tp6).Выглядит примерно так:

    tp1     tp2     tp3     tp4     tp5     tp6
    K06167  K14521  K17095  K21805  K03238  K18213
    K07376  K17095  K01424  K13116  K03283  K14521
    K03347  K14521  K14319  K00799  K08901  K01756
    K20179  K01693  K01682  K03283  K02716  K03238
    K03527  K02882  K01414  K01693  K08907  K01850
    K08901  K02912  K00940  K14319  K00411  K01768
    K11481  K02868  K04043  K14835  K01414  K15335
    K02716  K14835  K12606  K19371  K00963  K12818
    K03545  K14766  K09550  K04043  K01749  K02975
    K08907  K00602  K15437  K09550  K03116  K03002
    K15470  K10798  K03456  K03687  K09550  K17679
    K16465  K14823  K18059  K03456  K08738  K13116
    K03116  K00940  K03115  K18534  K08907  K14521
    K08738  K16474  K15502  K03495  K03687  K01937
    K08907  K19371  K00026  K13100  K08907  K03002
    .
    .
    .

Я хотел бы создать список, содержащий все соответствующие значения Kvalue, соответствующие каждой возможной комбинации из 6 векторов.Например, для комбинации tp2 и tp3 я хочу найти все значения, которые имеют два общих вектора, но не отображаются ни в одном из других векторов (tp1, tp4, tp5, tp6).В этом случае это будет K00940.Возможно ли это с векторами различной длины в R?

Был подобный вопрос, заданный в

Поиск всех возможных комбинаций векторных пересечений?

и я попробовал один из кодов, приведенных в ответах.Хотя код дает мне все возможные комбинации и их соответствующие значения в большом списке, он не учитывает, что мне нужны только уникальные пересечения между различными векторами.Например, комбинация tp2 и tp3 дала мне все возможные значения, которые два вектора совместно использовали, но включали значения, которые присутствовали в других векторах, которые также присутствовали в tp2 и tp3.Я просто хочу, чтобы уникальные значения были общими только для tp2 и tp3.

veclist <- list(tp1, tp2, tp3, tp4, tp5, tp6) 

combos <- Reduce(c,lapply(1:length(veclist), function(x) combn(1:length(veclist),x,simplify=FALSE)))

CKUP_combos <- lapply(combos, function(x) Reduce(intersect, veclist[x]) )

Ответы [ 2 ]

1 голос
/ 26 сентября 2019
sel = function(x)
{
  sh = names(veclist)%in%names(x)
  a = setdiff(Reduce(intersect,veclist[sh]),unlist(veclist[!sh]))
 if (length(a)>0) setNames(list(a),toString(names(x)))
}

res = Map(combn,list(veclist),1:6,c(sel),simplify=F)
unlist(unlist(res,FALSE),FALSE)
0 голосов
/ 26 сентября 2019

Определите следующую функцию:

getUniqueIntersections <- function(veclist, col1name, col2name){
  #Returns vector of all strings in components col1name and col2name of veclist
  # that are not in any of the other components of veclist.

  inc1 <- veclist[[col1name]]
  inc2 <- veclist[[col2name]]
  inc <- intersect(inc1, inc2) 

  excNames <- setdiff(names(veclist), c(col1name, col2name))
  exc <- unique(do.call(c, veclist[excNames]))

  result <- setdiff(inc, exc)

  return(result)
}

Затем определите фрейм данных всех пар, через которые мы хотим выполнить итерацию (при условии, что veclist - это список всех векторов):

dfCombNames <- as.data.frame(combn(names(veclist), 2))
dfCombNames
#   V1  V2  V3  V4  V5  V6  V7  V8  V9 V10 V11 V12 V13 V14 V15
#1 tp1 tp1 tp1 tp1 tp1 tp2 tp2 tp2 tp2 tp3 tp3 tp3 tp4 tp4 tp5
#2 tp2 tp3 tp4 tp5 tp6 tp3 tp4 tp5 tp6 tp4 tp5 tp6 tp5 tp6 tp6

Наконец, создайте список результатов, просматривая каждый столбец в dfCombNames.

  • row1 и row2 каждого столбца в dfCombNames объединяются вместе, чтобы сформировать имена ключей компонентов списка,например, «tp2, tp3»
  • getUniqueIntersections применяется к значениям в row1 и row2, которые соответствуют парам рассматриваемых столбцов, чтобы получить уникальные значения пересечения для этой пары.
resultList <- list()
for(col in dfCombNames){
  col1 <- as.character(col[1])
  col2 <- as.character(col[2])
  compName <- paste(as.character(col), collapse=",")
  resultList[[compName]] <- getUniqueIntersections(veclist, col1, col2)
}

resultList должен содержать требуемые значения, например,

> resultList[["tp2,tp3"]]
[1] "K17095" "K00940"

> resultList[["tp1,tp5"]]
[1] "K08901" "K02716" "K08907" "K03116" "K08738"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...