R - 按列比较两行并将结果写入表中

Paw*_*wel 5 r seq

我是 R 新手,可能我的问题的解决方案非常简单,但目前超出了我的能力范围...我想按列比较数据框中的行。每列中的数据是一个字母(核苷酸碱基):

seq1 A C T G T
seq2 A C G G G
seq3 A G G C A
...
Run Code Online (Sandbox Code Playgroud)

我想按列比较数据集中的所有行。我想得到的结果是比较中TRUE和FALSE的简单1或0,也以表格的形式写出来。所以它看起来像这样:

seq1_seq2 1 1 0 1 0
seq1_seq3 1 0 0 0 0
seq2_seq3 1 0 1 0 0
...
Run Code Online (Sandbox Code Playgroud)

我的 R 技能太低,无法写出有用的东西。然而,我设法发现

ifelse(data[1,]==data[2,], 1, 0) 
Run Code Online (Sandbox Code Playgroud)

返回几乎我需要的内容,但没有显示比较哪些行(没有 seq1_seq2 列)。对于这个问题的任何帮助,我将不胜感激。当然,最需要的是完整解决方案的示例,但我也将感谢有关如何解决此问题的任何建议。

先感谢您!

use*_*264 5

按行在数据帧中存储序列是错误的。您应该按列存储序列,或者,如果按行存储它们,至少在矩阵而不是数据框中进行。下面我假设您使用矩阵。您可以将数据帧转换为矩阵as.matrix

如果你想避免循环,你应该用于combn此类任务

> a
     [,1] [,2] [,3] [,4] [,5]
seq1 "A"  "C"  "T"  "G"  "T" 
seq2 "A"  "C"  "G"  "G"  "G" 
seq3 "A"  "G"  "G"  "C"  "A" 

> compare = t(combn(nrow(a),2,FUN=function(x)a[x[1],]==a[x[2],]))
> rownames(compare) = combn(nrow(a),2,FUN=function(x)paste0("seq",x[1],"_seq",x[2]))

> compare
          [,1]  [,2]  [,3]  [,4]  [,5]
seq1_seq2 TRUE  TRUE FALSE  TRUE FALSE
seq1_seq3 TRUE FALSE FALSE FALSE FALSE
seq2_seq3 TRUE FALSE  TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)

将布尔值转换为整数(如果你确实需要的话):

storage.mode(比较) = "整数"