[英]How to match columns or strings in R regardless of order
我试图找到基因共表达网络之间的共同点。 这是一个玩具示例:
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名称的列。
我不知道以下内容是否使您接近所需的内容,但确实可以解决字符串匹配的问题。
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
我不知道你想要什么 这是我的尝试。 如果您以相同的方式订购基因,也许对您有帮助。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.