使用R删除反向重复项

使用R删除反向重复项,r,string,dataframe,R,String,Dataframe,我在R中有一个数据框,其中包含拟南芥中同源基因的基因ID,如下所示: gene_x gene_y AT1 AT2 AT3 AT4 AT1 AT2 AT1 AT3 AT2 AT1 与基因名称对应的“ATx” 现在,对于下游分析,我只想继续使用唯一对。有些对只是简单的重复项,使用duplicated()函数即可轻松删除。 但是,上面的人造数据框中的第五行也是重复的,但顺序相反,duplicated()和unique()函数都不会拾取

我在R中有一个数据框,其中包含拟南芥中同源基因的基因ID,如下所示:

gene_x    gene_y
AT1       AT2
AT3       AT4
AT1       AT2
AT1       AT3
AT2       AT1
与基因名称对应的“ATx”

现在,对于下游分析,我只想继续使用唯一对。有些对只是简单的重复项,使用
duplicated()
函数即可轻松删除。 但是,上面的人造数据框中的第五行也是重复的,但顺序相反,
duplicated()
unique()
函数都不会拾取该行

关于如何删除这些行有什么想法吗

mydf <- read.table(text="gene_x    gene_y
AT1       AT2
AT3       AT4
AT1       AT2
AT1       AT3
AT2       AT1", header=TRUE, stringsAsFactors=FALSE)
这里有一个稍微不同的解决方案:

mydf[!duplicated(lapply(as.data.frame(t(mydf), stringsAsFactors=FALSE), sort)),]
  gene_x gene_y
1    AT1    AT2
2    AT3    AT4
4    AT1    AT3

dplyr
可能性可能是:

mydf %>%
 group_by(grp = paste(pmax(gene_x, gene_y), pmin(gene_x, gene_y), sep = "_")) %>%
 slice(1) %>%
 ungroup() %>%
 select(-grp)

  gene_x gene_y
  <chr>  <chr> 
1 AT1    AT2   
2 AT1    AT3   
3 AT3    AT4  
或:

或者使用
dplyr
purrr

mydf %>%
 group_by(grp = paste(invoke(pmax, .), invoke(pmin, .), sep = "_")) %>%
 slice(1) %>%
 ungroup() %>%
 select(-grp)
purrr 0.3.0
invoke()
失效后,应改用
exec()

mydf %>%
 group_by(grp = paste(exec(pmax, !!!.), exec(pmin, !!!.), sep = "_")) %>%
 slice(1) %>%
 ungroup() %>%
 select(-grp)
或:


另一种以tidyverse为中心的方法,但使用
purr

mydf %>%
 group_by(grp = paste(invoke(pmax, .), invoke(pmin, .), sep = "_")) %>%
 slice(1) %>%
 ungroup() %>%
 select(-grp)
库(tidyverse)
c_排序_折叠%
排序()%>%
str_c(collapse=“.”)
}
mydf%>%
突变(x_y=map2_chr(基因x,基因y,c_排序折叠))%>%
不同(x_y,.keep_all=TRUE)%>%
选择(-x_y)
#>基因x基因y
#>一对一对二
#>2点3分4分
#>3点对1点对3点

先排序,然后查找重复项。我建议你给我们提供一个可复制的例子。小心!通过使用
collapse=''
您可能会无意中删除一些不重复的基因对。例如,
ABC
-
DE
对将被删除,如果存在
AB
-
CDE
对(因为它们在粘贴在一起时形成
ABCDE
)。因此,通过将
collapse='
更改为
collapse='.
,此解决方案可以完美地工作。您如何更改代码以同时排除对重复数据的第一次观察,即仅在输出中保留原始数据帧的第2行和第3行?
mydf %>%
 group_by(grp = paste(invoke(pmax, .), invoke(pmin, .), sep = "_")) %>%
 slice(1) %>%
 ungroup() %>%
 select(-grp)
mydf %>%
 group_by(grp = paste(exec(pmax, !!!.), exec(pmin, !!!.), sep = "_")) %>%
 slice(1) %>%
 ungroup() %>%
 select(-grp)
df %>%
 rowwise() %>%
 mutate(grp = paste(sort(c(gene_x, gene_y)), collapse = "_")) %>%
 group_by(grp) %>%
 slice(1) %>%
 ungroup() %>%
 select(-grp)