【发布时间】:2016-05-05 09:01:49
【问题描述】:
我的data.frame 有 200 多列,并在下面包含了一个子集,包括与此问题相关的列:
>df
Variant Pos ID DB.0.count DB.1.count sample1 sample2 sample3 sample4 sample5 sample6 sample7 sample8 sample9 sample10
variant5 1234567 A 5 5 1/0 1/0 1/0 1/1 1/1 0/0 1/0 0/0 1/0 1/1
. . . . . F1 F1 F1 F2 F2 F3 F4 F4 F4 F5
我想:
1. 将 samples1-sample10 列的所有可能组合,其中每个组合包含来自每个 F 数的一个样本,即每个组合包含 5 个样本,每个样本来自 F1、F2、F3, F4,F5。
所以在上面的例子中会有 18 种组合,例如:
第一个组合是 sample1, sample4, sample6, sample7, sample10
第二个组合是 sample1, sample4, sample6, sample8, sample10
第三个组合是 sample1, sample4, sample6, sample9, sample10
在阅读了相关帖子后,我玩过unique、duplicated 和distinct,但一无所获。
然后我想将每个唯一组合输出到新的data.frame,对样本中的每个变量执行计数并将结果输出到新列,并执行如下所示的 Fisher 精确测试并输出到新列,如下,下面的代码应该可以做到:(在这里学习的费雪代码:Fisher's exact test on values from large dataframe and bypassing errors)
df.combo.1$pop.0/0.count <- apply(df.combo.1[,6:10], 1, function(u) length(which(grepl("0/0",u))==TRUE) )
df.combo.1$pop.1/0.count <- apply(df.combo.1[,6:10], 1, function(u) length(which(grepl("1/0",u))==TRUE) )
df.combo.1$pop.1/1.count <- apply(df.combo.1[,6:10], 1, function(u) length(which(grepl("1/1",u))==TRUE) )
df.combo.1$pop.0.count <- ( 2*(apply(df.combo.1[,6:10], 1, function(u) length(which(grepl("0/0",u))==TRUE) )) + apply(df.combo.1[,6:10], 1, function(u) length(which(grepl("0/1",u))==TRUE) ) )
df.combo.1$pop.1.count <- ( 2*(apply(df.combo.1[,6:10], 1, function(u) length(which(grepl("1/1",u))==TRUE) )) + apply(df.combo.1[,6:10], 1, function(u) length(which(grepl("0/1",u))==TRUE) ) )
res <- NULL
for (i in 1:nrow(df.combo.1)){
table <- matrix(c(df.combo.1[i, 4], df.combo.1[i, 5], df.combo.1[i, 14], df.combo.1[i, 15]), ncol = 2, byrow = TRUE)
# if any NA occurs in your table save an error in p else run the fisher test
if(any(is.na(table))) p <- "error" else p <- fisher.test(table)$p.value
# save all p values in a vector
res <- c(res,p)
}
df.combo.1$fishers <- res
>df.combo.1
Variant Pos ID DB.0.count DB.1.count sample1 sample4 sample6 sample7 sample10 pop.0/0.count pop.1/0.count pop.1/1.count pop.0.count pop.1.count fishers
variant5 1234567 A 5 5 1/0 1/1 0/0 1/0 1/1 1 2 2 4 6 1.0000
. . . . . F1 F2 F3 F4 F5
2. 最后,我想创建一个data.frame,其中列出了 Fisher 对每个独特组合的确切 p 值,如下所示:
>new.df
combo fishers
1 1.0000
2 1.0000
3 1.0000
4 1.0000
etc
我认为整个练习可能需要某种 for 循环?
【问题讨论】:
标签: r bioinformatics