首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用"if“来克服数据本质上是r中的常量错误?

如何使用"if“来克服数据本质上是r中的常量错误?
EN

Stack Overflow用户
提问于 2019-11-01 18:38:12
回答 2查看 1.6K关注 0票数 0

我需要比较细菌基因表达丰度的对照和疾病样本。我有一个由R.读取的大数据集,它包含58,000行不同的基因,以及6列。前三栏表示控制中的数值,其余三列来自疾病患者。

数据是一个矩阵,所有的值都是数值。

我对R是新手,我试图弄清楚如何包含一个"if“来防止错误”数据本质上是恒定的“,我认为这是因为很多基因表达值在疾病组和对照组中都是相同的(两个组中的一些基因表达值也是0)。

我使用的代码如下;

代码语言:javascript
复制
pvalues <- apply(finalgenecount, 1, function(currRow)
    { t.test(currRow[4:6], currRow[1:3])$p.value } )

我基本上需要找出哪一种基因在疾病和对照中最丰富,我打算用折叠式改变来根据上述编码中的pvalue来确定哪些基因在疾病组中增加。

我正在努力地加入一个“如果”来正确地克服我的错误。

如果你有什么建议,请告诉我。谢谢你

准确的错误信息:

代码语言:javascript
复制
Error in t.test.default(currRow[4:6], currRow[1:3]) : 
  data are essentially constant is the error message.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-01 18:45:11

我发现解决这个问题的最好方法是分别编写函数,然后使用apply函数。

首先,我们有reprex数据。

代码语言:javascript
复制
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测试失败,它将抛出安娜而不是一个错误。

代码语言:javascript
复制
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,如果函数失败,则返回错误;如果有结果,则返回结果。现在您可以应用这个函数了。

代码语言:javascript
复制
out <- apply(dat, 1,you_function )

我们还将根据数据中的列名来命名这个新向量。

代码语言:javascript
复制
names(out) <- colnames(dat)

out

这将使我们:

代码语言:javascript
复制
SRR527345 SRR527312 SRR527312  SRR52324 SRR525625  SRR53526 
0.3923287 0.4226497 0.4134629 0.3881068 0.4226497 0.4226497 

现在,我们可以添加一个阈值,只返回那些满足某种阈值的基因名称。由于上面的值大多都>.4,为了说明起见,我会将阈值设置为这个级别。如果你想把门槛降到0.05,你可以。

代码语言:javascript
复制
p_thresh <- 0.4

names(out)[out <= p_thresh]

这将使我们:

代码语言:javascript
复制
[1] "SRR527345" "SRR52324" 

在重复相同值的“坏”数据上测试此值如下所示:

代码语言:javascript
复制
bad <- matrix(rep(1, 36), ncol = 6)

out <- apply(bad, 1,you_function )

out

它输出以下内容。你还是会收到信息的,但是

代码语言:javascript
复制
[1] NA NA NA NA NA NA
票数 0
EN

Stack Overflow用户

发布于 2019-11-01 20:12:05

似乎您正在将一个t.test应用于两个向量,每一行两个三重奏。如果其中一个集有3个相等的值,它将抛出一个错误。

没有数据,很难手工定制一个好的解决方案,但是您只能选择这两组元素1:3和4:6至少有一个元素不同的行。

代码语言:javascript
复制
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,]
) 

基本上,您只需要使用在两个设置的匹配上都没有值的行。因此"!“若要对任一集合上的一对列为真的任何情况进行逻辑检查,请执行以下操作。可以以其他方式进行此筛选,但此方法不需要任何包。

代码语言:javascript
复制
pvalues <- apply(finalgenecount[selection_vector ,], 1, function(currRow)
  {
  t.test(currRow[4:6], currRow[1:3])$p.value})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58664238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档