如何使用“ if”克服r中的数据本质上是恒定误差?

时间:2019-11-01 18:38:12

标签: r

我需要比较对照和疾病样品之间细菌基因表达的丰度。我有一个大的数据集,已被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.

2 个答案:

答案 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})