用R删除反向重复项

Koe*_*VdB 8 string r dataframe

我在R中有一个包含拟南芥中旁系同源基因的数据框,看起来像这样:

gene_x    gene_y
AT1       AT2
AT3       AT4
AT1       AT2
AT1       AT3
AT2       AT1
Run Code Online (Sandbox Code Playgroud)

与'ATx'对应的基因名称.

现在,对于下游分析,我希望仅继续使用唯一对.有些对只是简单的重复,可以在使用该duplicated()功能时轻松删除.但是,上面的人工数据框中的第五行也是重复的,但是按相反的顺序,并且不会被函数拾取duplicated(),也不会被unique()函数拾取.

有关如何删除这些行的任何想法?

Tho*_*mas 9

mydf <- read.table(text="gene_x    gene_y
AT1       AT2
AT3       AT4
AT1       AT2
AT1       AT3
AT2       AT1", header=TRUE, stringsAsFactors=FALSE)
Run Code Online (Sandbox Code Playgroud)

下面是使用一个策略apply,sort,paste,和duplicated:

mydf[!duplicated(apply(mydf,1,function(x) paste(sort(x),collapse=''))),]
  gene_x gene_y
1    AT1    AT2
2    AT3    AT4
4    AT1    AT3
Run Code Online (Sandbox Code Playgroud)

这是一个略有不同的解决方案:

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

  • 小心!通过使用“ collapse =”,您可能无意中删除了一些非重复的基因对。例如,如果有AB对-CDE对,则将删除ABC对-DE对(因为它们粘贴在一起时都形成ABCDE对)。因此,通过将'collapse ='`更改为`collapse ='_'`,此解决方案可以完美地工作。 (2认同)

tmf*_*mnk 8

一种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  
Run Code Online (Sandbox Code Playgroud)

或者:

mydf %>%
 group_by(grp = paste(pmax(gene_x, gene_y), pmin(gene_x, gene_y), sep = "_")) %>%
 filter(row_number() == 1) %>%
 ungroup() %>%
 select(-grp)
Run Code Online (Sandbox Code Playgroud)

或者:

mydf %>%
 group_by(grp = paste(pmax(gene_x, gene_y), pmin(gene_x, gene_y), sep = "_")) %>%
 distinct(grp, .keep_all = TRUE) %>%
 ungroup() %>%
 select(-grp)
Run Code Online (Sandbox Code Playgroud)

或使用dplyrpurrr

mydf %>%
 group_by(grp = paste(invoke(pmax, .), invoke(pmin, .), sep = "_")) %>%
 slice(1) %>%
 ungroup() %>%
 select(-grp)
Run Code Online (Sandbox Code Playgroud)

并且 as ofpurrr 0.3.0 invoke()已退休,exec()应改为使用:

mydf %>%
 group_by(grp = paste(exec(pmax, !!!.), exec(pmin, !!!.), sep = "_")) %>%
 slice(1) %>%
 ungroup() %>%
 select(-grp)
Run Code Online (Sandbox Code Playgroud)

或者:

df %>%
 rowwise() %>%
 mutate(grp = paste(sort(c(gene_x, gene_y)), collapse = "_")) %>%
 group_by(grp) %>%
 slice(1) %>%
 ungroup() %>%
 select(-grp)
Run Code Online (Sandbox Code Playgroud)