首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用R删除反向重复

用R删除反向重复
EN

Stack Overflow用户
提问于 2014-03-31 08:00:15
回答 3查看 4.2K关注 0票数 13

我在R中有一个数据框架,其中包含拟南芥中类似基因的基因ids,如下所示:

代码语言:javascript
复制
gene_x    gene_y
AT1       AT2
AT3       AT4
AT1       AT2
AT1       AT3
AT2       AT1

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

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

对如何删除这些行有什么想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-31 08:09:58

代码语言:javascript
复制
mydf <- read.table(text="gene_x    gene_y
AT1       AT2
AT3       AT4
AT1       AT2
AT1       AT3
AT2       AT1", header=TRUE, stringsAsFactors=FALSE)

这里有一个使用applysortpasteduplicated的策略

代码语言:javascript
复制
mydf[!duplicated(apply(mydf,1,function(x) paste(sort(x),collapse=''))),]
  gene_x gene_y
1    AT1    AT2
2    AT3    AT4
4    AT1    AT3

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

代码语言:javascript
复制
mydf[!duplicated(lapply(as.data.frame(t(mydf), stringsAsFactors=FALSE), sort)),]
  gene_x gene_y
1    AT1    AT2
2    AT3    AT4
4    AT1    AT3
票数 13
EN

Stack Overflow用户

发布于 2019-05-17 21:17:50

dplyr的一种可能是:

代码语言:javascript
复制
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  

或者:

代码语言:javascript
复制
mydf %>%
 group_by(grp = paste(pmax(gene_x, gene_y), pmin(gene_x, gene_y), sep = "_")) %>%
 filter(row_number() == 1) %>%
 ungroup() %>%
 select(-grp)

或者:

代码语言:javascript
复制
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

代码语言:javascript
复制
mydf %>%
 group_by(grp = paste(invoke(pmax, .), invoke(pmin, .), sep = "_")) %>%
 slice(1) %>%
 ungroup() %>%
 select(-grp)

purrr 0.3.0 invoke()退休后,应该使用exec()

代码语言:javascript
复制
mydf %>%
 group_by(grp = paste(exec(pmax, !!!.), exec(pmin, !!!.), sep = "_")) %>%
 slice(1) %>%
 ungroup() %>%
 select(-grp)

或者:

代码语言:javascript
复制
df %>%
 rowwise() %>%
 mutate(grp = paste(sort(c(gene_x, gene_y)), collapse = "_")) %>%
 group_by(grp) %>%
 slice(1) %>%
 ungroup() %>%
 select(-grp)
票数 11
EN

Stack Overflow用户

发布于 2020-06-15 05:04:45

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

代码语言:javascript
复制
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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22756392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档