如何使用apply在循环中运行chisq.test

时间:2014-06-23 05:42:29

标签: r loops matrix apply chi-squared

我是R.的新手 由于我的项目的需要,我需要对数十万个条目进行Chisq测试。

我自己学习了几天,并编写了一些用于在循环中运行chisq.test的代码。 代码:

the.data = read.table ("test_chisq_allelefrq.txt", header=T, sep="\t",row.names=1)
p=c()
ID=c()
for (i in 1:nrow(the.data)) {
data.row = the.data [i,]
data.matrix = matrix ( c(data.row$cohort_1_AA, data.row$cohort_1_AB,       data.row$cohort_1_BB, data.row$cohort_2_AA, data.row$cohort_2_AB, data.row$cohort_2_BB,data.row$cohort_3_AA,data.row$cohort_3_AB,data.row$cohort_3_BB), byrow=T, nrow=3)
chisq = chisq.test(data.matrix)
pvalue=chisq$p.value
p=c(p, pvalue)
No=row.names(the.data)[i]
ID=c(rsid, SNP )
}
results=data.frame(ID,p)
write.table (results,  file = "chisq-test_output.txt", append=F, quote = F, sep = "\t ",eol = "\n", na = "NA", dec = ".", row.names = F, col.names = T) 

此代码可能有几个问题。但它确实有效。

然而,它运行得很慢。

我尝试使用“apply”

来改进它

我打算使用两次申请,而不是使用“for”

datarow= apply (the.data,1,  matrix(the.data, byrow=T, nrow=3))
result=apply(datarow,1,chisq.test)

然而,有错误说矩阵不是一个函数。 zsd chisq.test输出是一个列表,我不能用write.table来输出数据。

the.data是这样的。

SN0001 and 9 numbers
           cohort_1_AA cohort_1_AB cohort_1_BB cohort_2_AA cohort_2_AB cohort_2_BB cohort_3_AA cohort_3_AB cohort_3_BB
SN0001     197         964        1088       877      858      168     351    435      20
....
....

我一直在努力昼夜。 希望可以有人帮帮我。 非常感谢你。

2 个答案:

答案 0 :(得分:0)

一个for循环意味着一个apply,而不是两个。

这样的事情:

result=apply(the.data, 1, function(data.row) {
   ## Your code using data.row
})

如果结果比for循环更具可读性,请使用它。否则坚持你所拥有的。 apply在速度方面明显不同(更快或更慢)。

答案 1 :(得分:0)

要使用应用功能组,首先要轻松定义我们自己的功能然后应用它。 让我们这样做。

    ##first define the function to apply
    Chsq <- function(x){
   ## input is a row of your data
   ## creating a table from each row
         x <- matrix(x,byrow =TRUE,nrow=3)
    ### this will return the p value
      return(chisq.test(x)$p.value)
    }
## Now apply this function
data = read.table ("test_chisq_allelefrq.txt", header=T, sep="\t",row.names=1)
## by using as.vector convert the output into a vector
P_Values <- as.vector(apply(data,1,Chsq))
result <- cbind(rownames(data),P_Values)
write.table (results,  file = "chisq-test_output.txt", append=F, quote = F, sep = "\t ",eol = "\n", na = "NA", dec = ".", row.names = F, col.names = T) 

试试这段代码,希望它有效!! :)如果它适合你,接受答案是正确的。感谢