Я считаю, что лучший способ решить эту проблему - написать функцию отдельно, а затем использовать функцию apply
.
Сначала у нас есть данные представлений.
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