使用R删除反向重复项
我在R中有一个数据框,其中包含拟南芥中同源基因的基因ID,如下所示:使用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()函数都不会拾取
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)