Как сопоставить столбцы или строки в R независимо от порядка - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь найти общие границы между коэкспрессионными сетями генов. Вот игрушечный пример:

Dataset 1    Dataset 2    Dataset 3
A:B          A:B          A:B
D:E          NA           D:E

Итак, пересекая эти столбцы, A: B - это ребро, которое нужно включить, но не D: E.

Моя проблема заключается в том, что мои края могут быть представлены в любом направлении: либо A: B, либо B: A. У меня также есть A и B как отдельные столбцы. Таким образом, любой фрейм данных будет выглядеть примерно так:

Gene1    Gene2    Edge
A        B        A:B

или это:

Gene1    Gene2    Edge
B        A        B:A

Это означает, что при попытке пересечения вы можете получить что-то вроде следующего:

Dataset 1    Dataset 2    Dataset 3    Dataset 4    Dataset5
B:A          A:B          A:B          B:A          A:B

Соответствующие строки не будут работать, так как они будут считаться разными, даже если отношения все те же

Как мне установить подкадр данных, который позволяет мне находить пару генов независимо от порядка гена? Либо запросив строку «gene1: gene2», либо используя столбец с именами Gene1 и столбец с именами Gene2.

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Понятия не имею, что вы хотите. Вот моя попытка. Может быть, это поможет вам, если вы просто упорядочите свои гены таким же образом.

df1 <- 
    structure(list(Dataset1 = c("B:A", "E:A"), Dataset2 = c("A:B", 
                                                            "A:E"), Dataset3 = c("A:B", "A:B"), Dataset4 = c("B:A", "E:A"
                                                            ), Dataset5 = c("A:B", "B:A")), row.names = c(NA, -2L), class = "data.frame")
#      Dataset1 Dataset2 Dataset3 Dataset4 Dataset5
#1      B:A      A:B      A:B      B:A      A:B
#2      E:A      A:E      A:B      E:A      B:A

library(magrittr)
fun1 <- function(x) {
    strsplit(x,":") %>% lapply(sort) %>% lapply(paste0,collapse=":") %>% unlist
}

df1[] %<>% lapply(fun1)

df1
#  Dataset1 Dataset2 Dataset3 Dataset4 Dataset5
#1      A:B      A:B      A:B      A:B      A:B
#2      A:E      A:E      A:B      A:E      A:B
0 голосов
/ 03 сентября 2018

Я не знаю, приближает ли это вас к тому, что вам нужно, но это решает проблему соответствия строк.

Dataset1 <- data.frame(Edge = c("A:B", "D:E"))
Dataset2 <- data.frame(Edge = c("A:B", NA))
Dataset3 <- data.frame(Edge = c("A:B", "D:E"))

splitSort <- function(x, split = ":"){
  x <- as.character(x)
  x <- strsplit(x, split)
  x <- lapply(x, function(y) paste(sort(y), collapse = split))
  unlist(x)
}

e1 <- splitSort(Dataset1$Edge)
e2 <- splitSort(Dataset2$Edge)
e3 <- splitSort(Dataset3$Edge)
r <- Reduce(function(x, y) intersect(x, y), list(e1, e2, e3))

i <- which(Dataset2$Edge %in% r)
Dataset2[i, , drop = FALSE]
#  Edge
#1  A:B
...