我有一个名为" case.control"有1000行和2000 col的列是case或control 所以我根据案例和控制分离它们,所以我现在有两个数据集 一个将是1000行和400 col = case 另一个1000行和600 col =控制 我试图在每一行进行费希尔测试
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
答案 0 :(得分: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")}