我是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
....
....
我一直在努力昼夜。 希望可以有人帮帮我。 非常感谢你。
答案 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)
试试这段代码,希望它有效!! :)如果它适合你,接受答案是正确的。感谢