我需要比较对照和疾病样品之间细菌基因表达的丰度。我有一个大的数据集,已被R读取。它包含58,000行(分别是不同的基因)和6列。前三列代表对照值,其余三列来自患病患者。
数据是一个矩阵,所有值都是数字。
我是R的新手,我试图弄清楚如何包含一个“ if”以防止错误“ data本质上是恒定的”,我认为这种情况正在发生,因为许多基因表达值都是在疾病组和对照组中都相同(两组中的某些基因表达值也为0)。
我正在使用的代码如下;
pvalues <- apply(finalgenecount, 1, function(currRow)
{ t.test(currRow[4:6], currRow[1:3])$p.value } )
我基本上需要找到疾病相对于对照中最丰富的基因,并要根据上述代码的p值使用倍数变化来确定疾病组中哪些基因增加。
我正在努力正确包含一个“ if”以克服我的错误。
如果您有任何建议,请告诉我。 谢谢
确切的错误消息:
Error in t.test.default(currRow[4:6], currRow[1:3]) :
data are essentially constant is the error message.
答案 0 :(得分:0)
我发现解决此问题的最佳方法是分别编写函数,然后使用apply
函数。
首先,我们有reprex数据。
dat <- structure(c(37L, 1L, 187L, 97L, 162L, 16L, 0L, 0L, 0L, 0L, 0L, 0L, 2L,
0L, 3L, 6L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L),
.Dim = c(6L, 6L),
.Dimnames = list( c("gene1_36040_cov_12.4365_1",
"gene2_36040_cov_12.4365_3",
"gene3_32139_cov_10.3119_1",
"gene4_32139_cov_10.3119_2",
"gene5_32139_cov_10.3119_3",
"gene6_27992_cov_10.5976_1" ),
c("SRR527345", "SRR527312", "SRR527312",
"SRR52324", "SRR525625", "SRR53526")))
然后,我们开发一个函数来对第4-6行再次测试第1-3行。如果t检验失败,它将抛出NA而不是错误。
you_function <- function(currRow){
res <- try(t.test(currRow[4:6], currRow[1:3])$p.value)
if(grepl(pattern = "Error", x = res)){
return(NA)
} else {
res
}
}
此函数使用try
,如果函数失败,则返回错误,如果有结果,则返回结果。现在您可以应用此功能
out <- apply(dat, 1,you_function )
我们还将根据数据中的列名称来命名此新向量。
names(out) <- colnames(dat)
out
哪个会给我们:
SRR527345 SRR527312 SRR527312 SRR52324 SRR525625 SRR53526
0.3923287 0.4226497 0.4134629 0.3881068 0.4226497 0.4226497
现在,我们可以添加一个阈值,并且仅返回满足某个阈值的那些基因名称。由于上述值大多> .4,因此出于说明目的,我将阈值设置为该水平。如果要将阈值降低到0.05,可以。
p_thresh <- 0.4
names(out)[out <= p_thresh]
哪个会给我们:
[1] "SRR527345" "SRR52324"
在重复相同值的“不良”数据上进行测试,如下所示:
bad <- matrix(rep(1, 36), ncol = 6)
out <- apply(bad, 1,you_function )
out
输出以下内容。您仍然会收到一条消息,但是
[1] NA NA NA NA NA NA
答案 1 :(得分:0)
似乎您正在将t.test应用于两个向量,每行两个三胞胎。如果任何一组具有3个相等的值,则会引发错误。
没有数据,很难手工设计一个好的解决方案,但是您只能选择其中两组元素1:3和4:6至少具有一个彼此不同的行。
selection_vector <- !(
finalgenecount[1,] == finalgenecount[2,] |
finalgenecount[1,] == finalgenecount[3,] |
finalgenecount[2,] == finalgenecount[3,] |
finalgenecount[4,] == finalgenecount[5,] |
finalgenecount[4,] == finalgenecount[6,] |
finalgenecount[5,] == finalgenecount[6,]
)
基本上,您只需要使用其中任一值都不匹配的行。因此,“!”在任一组上的一对列为真的任何情况下,都可以反转逻辑检查。可以用其他方法制作此过滤器,但是此方法不需要任何包装。
pvalues <- apply(finalgenecount[selection_vector ,], 1, function(currRow)
{
t.test(currRow[4:6], currRow[1:3])$p.value})