我需要比较细菌基因表达丰度的对照和疾病样本。我有一个由R.读取的大数据集,它包含58,000行不同的基因,以及6列。前三栏表示控制中的数值,其余三列来自疾病患者。
数据是一个矩阵,所有的值都是数值。
我对R是新手,我试图弄清楚如何包含一个"if“来防止错误”数据本质上是恒定的“,我认为这是因为很多基因表达值在疾病组和对照组中都是相同的(两个组中的一些基因表达值也是0)。
我使用的代码如下;
pvalues <- apply(finalgenecount, 1, function(currRow)
{ t.test(currRow[4:6], currRow[1:3])$p.value } )我基本上需要找出哪一种基因在疾病和对照中最丰富,我打算用折叠式改变来根据上述编码中的pvalue来确定哪些基因在疾病组中增加。
我正在努力地加入一个“如果”来正确地克服我的错误。
如果你有什么建议,请告诉我。谢谢你
准确的错误信息:
Error in t.test.default(currRow[4:6], currRow[1:3]) :
data are essentially constant is the error message.发布于 2019-11-01 18:45:11
我发现解决这个问题的最好方法是分别编写函数,然后使用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测试失败,它将抛出安娜而不是一个错误。
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发布于 2019-11-01 20:12:05
似乎您正在将一个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})https://stackoverflow.com/questions/58664238
复制相似问题