我在R中有一个数据框架,其中包含拟南芥中类似基因的基因ids,如下所示:
gene_x gene_y
AT1 AT2
AT3 AT4
AT1 AT2
AT1 AT3
AT2 AT1与基因名称对应的“ATx”。
现在,对于下游分析,我只想继续使用唯一的对。有些对只是简单的重复,在使用duplicated()函数时可以很容易地删除。然而,上面人工数据帧中的第五行也是重复的,但顺序相反,不会被duplicated()或unique()函数捕获。
对如何删除这些行有什么想法吗?
发布于 2014-03-31 08:09:58
mydf <- read.table(text="gene_x gene_y
AT1 AT2
AT3 AT4
AT1 AT2
AT1 AT3
AT2 AT1", header=TRUE, stringsAsFactors=FALSE)这里有一个使用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这里有一个稍微不同的解决方案:
mydf[!duplicated(lapply(as.data.frame(t(mydf), stringsAsFactors=FALSE), sort)),]
gene_x gene_y
1 AT1 AT2
2 AT3 AT4
4 AT1 AT3发布于 2019-05-17 21:17:50
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)或者使用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)或者:
df %>%
rowwise() %>%
mutate(grp = paste(sort(c(gene_x, gene_y)), collapse = "_")) %>%
group_by(grp) %>%
slice(1) %>%
ungroup() %>%
select(-grp)发布于 2020-06-15 05:04:45
另一种以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 AT3https://stackoverflow.com/questions/22756392
复制相似问题