我是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列)。 我很感激这个问题的任何帮助。当然,完整解决方案的一个例子是最需要的,但我也将对如何解决这个问题的任何建议表示感谢。
提前谢谢!
答案 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
工作原理:
combn
生成所有可能的行索引对sapply
遍历myData
m
的向量类比,其中行索引由myData