如何在R或shell中找到镜像值?

ttvkxqim  于 2023-02-05  发布在  Shell
关注(0)|答案(5)|浏览(208)

我很难弄清楚如何在R中找到镜像值。"镜像"可能是一个不正确的术语,我认为这是对我寻找答案的挑战。也许"反向复制"或"反向复制"更有意义。无论它被称为什么,我认为这是一个非常简单的想法,可能有也可能没有一个简单的解决方案。
以下是我的数据:

df <- data.frame("unique"=c("chr1_10_20:chr1_10_20","chr1_10_20:chr1_20_30", "chr1_10_20:chr1_30_40", "chr1_20_30:chr1_10_20"))

> df 
                 unique
1 chr1_10_20:chr1_10_20
2 chr1_10_20:chr1_20_30
3 chr1_10_20:chr1_30_40
4 chr1_20_30:chr1_10_20

我感兴趣的是使用冒号(:)作为中间分隔符来查找作为其他行镜像的行。通过查看第2行和第4行,您可以理解我的意思。在第2行,左侧的:为chr1_10_20,右侧为chr1_20_30。行4正好相反,左侧为chr1_20_30,右侧为chr1_10_20。
我希望获得显示此镜像质量的行号。对于上面的示例,我希望的输出为:
二、四

2,4
我在R工作,但是如果更容易的话可以考虑使用shell。提前感谢!

b5lpy0ml

b5lpy0ml1#

这里有一个简单的方法来解决这个问题,我们把数据框分成两列,用一个循环来查看每一行在另一列中有没有相同的条目,然后反过来做同样的事情,最后删除那些相同的条目,然后我们可以用whicharr.ind=TRUE来得到我们想要的匹配。

df <- data.frame("unique"=c("chr1_10_20:chr1_10_20","chr1_10_20:chr1_20_30", "chr1_10_20:chr1_30_40", "chr1_20_30:chr1_10_20"))

df_split <- strsplit(df$unique, ":") %>% do.call(what=rbind)

sim_mat <- sapply(1:nrow(df_split), function(i){
  df_split[i,1]==df_split[,2] & df_split[i,2]==df_split[,1] & df_split[i,1]!=df_split[i,2]
})
all_matches <- which(sim_mat, arr.ind = TRUE)
all_matches[all_matches[,"row"]<all_matches[,"col"]]

它给出了

[1] 2 4
e5nqia27

e5nqia272#

使用Regex对冒号前后的文本进行分组;然后创建一个新的字符串after:before并保存为新变量flip。
然后使用match查找匹配的翻转行:

df <- data.frame(text=c("chr1_10_20:chr1_10_20","chr1_10_20:chr1_20_30", "chr1_10_20:chr1_30_40", "chr1_20_30:chr1_10_20"))

df$flip <- gsub("^(.*):(.*)$", "\\2:\\1", df$text)

df$matchrow <- match(df$text, df$flip)

df
#                   text                  flip matchrow
#1 chr1_10_20:chr1_10_20 chr1_10_20:chr1_10_20        1
#2 chr1_10_20:chr1_20_30 chr1_20_30:chr1_10_20        4
#3 chr1_10_20:chr1_30_40 chr1_30_40:chr1_10_20       NA
#4 chr1_20_30:chr1_10_20 chr1_10_20:chr1_20_30        2
rmbxnbpk

rmbxnbpk3#

使用bashawk

% awk -F ':' 'NR>1{x++; arr[x,1] = $1; arr[x,2] = $2 } 
    END{ for(i=1; i<=x; i++){ 
           for(j=i; j<=x; j++){ 
             if(arr[i,1] != arr[i,2] && arr[i,1]arr[i,2] == arr[j,2]arr[j,1]){ 
               print i,j}}}}' file
2 4
数据
% cat file
unique
chr1_10_20:chr1_10_20
chr1_10_20:chr1_20_30
chr1_10_20:chr1_30_40
chr1_20_30:chr1_10_20
dba5bblo

dba5bblo4#

按分隔符拆分,排序,然后检查 * 是否从顶部或从底部重复(fromLast = TRUE),使用 which 获取索引:

x <- t(sapply(strsplit(df$unique, ":", fixed = TRUE), sort))

which(duplicated(x) | duplicated(x, fromLast = TRUE))
# [1] 2 4
but5z9lq

but5z9lq5#

用于多awk代码兼容性的便利测试框架:

for __ in 'nawk     ' 'mawk     ' 'mawk2    ' 'gawk     '
          'gawk -ce ' 'gawk -nbe' 'gawk -Mbe' 'gawk -Pe '; do 

    echo " $__ ::: $(echo 'chr1_10_20:chr1_10_20
                           chr1_10_20:chr1_20_30
                           chr1_10_20:chr1_30_40
                           chr1_20_30:chr1_10_20' | 

    $(<<< "$__") 'BEGIN { _ *= split("", __, SUBSEP = FS = ":")
                  } $_ in __ ? $!NF = __[$_] " " NR : \
                              (__[$NF,  $!_]  =  NR)*_' )"
done
nawk      ::: 2 4
 mawk      ::: 2 4
 mawk2     ::: 2 4
 gawk      ::: 2 4
 gawk -ce  ::: 2 4
 gawk -nbe ::: 2 4
 gawk -Mbe ::: 2 4
 gawk -Pe  ::: 2 4

相关问题