【问题标题】:Deleting reversed duplicates with R使用 R 删除反向重复项
【发布时间】:2014-05-10 11:40:07
【问题描述】:

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

gene_x    gene_y
AT1       AT2
AT3       AT4
AT1       AT2
AT1       AT3
AT2       AT1

带有与基因名称对应的“ATx”。

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

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

【问题讨论】:

标签: r string dataframe


【解决方案1】:

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

library(tidyverse)

c_sort_collapse <- function(...){
  c(...) %>% 
    sort() %>% 
    str_c(collapse = ".")
}

mydf %>% 
  mutate(x_y = map2_chr(gene_x, gene_y, c_sort_collapse)) %>% 
  distinct(x_y, .keep_all = TRUE) %>% 
  select(-x_y)
#>   gene_x gene_y
#> 1    AT1    AT2
#> 2    AT3    AT4
#> 3    AT1    AT3

【讨论】:

    【解决方案2】:

    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  
    

    或者:

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

    或者:

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

    或者使用dplyrpurrr

    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)
    

    或者:

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

    【讨论】:

      【解决方案3】:
      mydf <- read.table(text="gene_x    gene_y
      AT1       AT2
      AT3       AT4
      AT1       AT2
      AT1       AT3
      AT2       AT1", header=TRUE, stringsAsFactors=FALSE)
      

      这是使用applysortpasteduplicated 的一种策略:

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

      这里有一个稍微不同的解决方案:

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

      【讨论】:

      • 小心!通过使用collapse='',您可能会无意中删除一些非重复的基因对。例如,如果有 AB - CDE 对,ABC - DE 对将被删除(因为它们在粘贴在一起时会形成 ABCDE)。因此,通过将 collapse='' 更改为 collapse='_',此解决方案可以完美运行。
      • 如何更改代码以排除重复的第一次观察,即在输出中仅保留原始数据帧的第 2 行和第 3 行?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-09
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 2015-09-30
      • 2016-10-10
      相关资源
      最近更新 更多