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

时间:2016-05-14 14:42:56

标签: r seq

我是R新手,可能我的问题的解决方案非常简单,但现在我无法实现... 我想按列比较数据框中的行。每列中的数据是一个字母(核苷酸碱基):

seq1 A C T G T
seq2 A C G G G
seq3 A G G C A
...

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

seq1_seq2 1 1 0 1 0
seq1_seq3 1 0 0 0 0
seq2_seq3 1 0 1 0 0
...

我在R中的技能太低,无法写出有用的东西。但是,我设法找到了

ifelse(data[1,]==data[2,], 1, 0) 

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

提前谢谢!

4 个答案:

答案 0 :(得分:2)

按行存储数据帧中的序列是错误的。您应该按列存储序列,或者,如果按行存储它们,至少要在矩阵而不是数据帧中存储它们。下面我假设您使用矩阵。您可以使用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

将布尔值转换为整数(如果你真的需要它):

  

storage.mode(compare)=“integer”

答案 1 :(得分:1)

在这种情况下,由于您希望完成所有n平方比较,因此以这种方式循环是一种选择:

result <- list()
for (i in 1:(nrow(df) - 1)) {
    for (j in (i + 1):nrow(df)) {
      result[[paste(row.names(df)[i], row.names(df)[j], sep = '_')]] <- as.integer(df[i, ] == df[j, ])
    }
}
as.data.frame(do.call(rbind, result))

结果输出如下:

          V1 V2 V3 V4 V5
seq1_seq2  1  1  0  1  0
seq1_seq3  1  0  0  0  0
seq2_seq3  1  0  1  0  0

当然,对于较大的数据集来说,这将非常慢。

答案 2 :(得分:1)

与Gopala有点不同的方法......可能有一种更简单的方法可以达到目的,但这里是:

#include <stdio.h>
#include <stdlib.h>

struct foo {
    int i;
};

struct bar {
    struct foo f;
};

static void func(struct foo *f, int i)
{
    f->i = i;
}

int main(void)
{
    struct bar *b = malloc(sizeof(*b));

    func((struct foo *)b, 1);
    printf("%d\n", b->f.i);
    return 0;
}

答案 3 :(得分:0)

您可以使用此代码(它使用@Dominic Comtois的答案中的myData):

m <- combn(nrow(myData),2)

result <- sapply(myData,function(C) {z=C[m];z[c(TRUE,FALSE)]==z[c(FALSE,TRUE)]})
#       n1    n2    n3    n4    n5
#[1,] TRUE  TRUE FALSE  TRUE FALSE
#[2,] TRUE FALSE FALSE FALSE FALSE
#[3,] TRUE FALSE  TRUE FALSE FALSE

工作原理:

  1. combn生成所有可能的行索引对
  2. sapply遍历myData
  3. 的每一列
  4. 对于每列,获取矩阵m的向量类比,其中行索引由myData
  5. 中的值替换
  6. 此向量的奇数元素包含第一行,偶数元素包含第二行,因此我们可以使用位掩码c(TRUE,FALSE)和c(FALSE,TRUE)来比较奇数/偶数元素。