0

我有一个名为“case.control”的数据有 1000 行和 2000 col 列是 case 或 control 所以我根据 case 和 control 将它们分开,所以我现在有两个数据集,一个是 1000 行和 400 col = case另一个 1000 行和 600 col = control 我试着在每一行做 Fisher 测试

dat1=c()
dat2=c()
for (i in 1:nrow(case)){
dat1[i]<-table(case[i,])
dat2[i]<-table(control[i,])
tab[i]<-as.table(rbind(dat[i],dat[i]))
fisher.test(tab, alternative="greater")}

此代码不起作用,因为有时我在单元格中的值为零,但代码将其更改为另一个数字,例如,如果我有

g1    g2 
400   0
500   100

将其更改为

g1     g2
400   400
500  100

任何建议

数据看起来像这个样本:

Positions      gene1   gene2   gene3 ...... gene2000
 1              0        1       2            2
 2              1        0       0            1
 3              2        1       1            1
 .
 .
 1000           1        0        0           0
4

1 回答 1

0

您的代码有两个主要问题。

首先,您的代码将不起作用,因为 tab、dat1 和 dat2 是向量,您将它们视为某种列表或数组。

其次,如果 CASE 中的一行包含与 CONTROL 不同的值,您也会得到错误。例如:

> x = c(1,2,1,0,1,4,3,2)
> y = c(x, 9)

> rbind(dat1,dat2)
     0 1 2 3 4 9
dat1 1 3 2 1 1 1
dat2 1 3 2 1 1 1

显然是错误的,因为 x 不包含 9 值。这样做的方法是首先将 dat1 和 dat2 转换为具有特定水平的因子。

固定代码:

dat1=list()
dat2=list()
tab=list()
for (i in 1:nrow(case)){
dat1[[i]]<-table(as.factor(case[i,], levels=1:4) #replace levels with all possible values in your data
dat2[[i]]<-table(as.factor(control[i,], levels=1:4) #replace levels with all possible values in your data
tab[[i]]<-as.table(rbind(dat[i],dat[i]))
fisher.test(tab, alternative="greater")}
于 2014-08-09T22:40:12.007 回答