我是 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 列)。对于这个问题的任何帮助,我将不胜感激。当然,最需要的是完整解决方案的示例,但我也将感谢有关如何解决此问题的任何建议。
先感谢您!
按行在数据帧中存储序列是错误的。您应该按列存储序列,或者,如果按行存储它们,至少在矩阵而不是数据框中进行。下面我假设您使用矩阵。您可以将数据帧转换为矩阵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(比较) = "整数"