Вот решение, которое гибко для количества выборок и строк данных.Он включает в себя преобразование данных в длинный формат, а затем фильтры для гена и конкретного образца.Я протестировал его на 50 тыс. Генов и 35 образцах, и он работал <1 секунду. </p>
library(tidyverse)
# set up sample data with 50000 rows
mydata <- data.frame(stringsAsFactors=FALSE,
X = c("GENE_1", "GENE_2", "GENE_3", "GENE_4", "GENE_5", "GENE_6", "GENE_7", 1:50000),
SAMPLE_1_FC = c(0.678, 0.234, 0.017, -0.0944, -0.808, 0.2091, 0.598, rnorm(50000, 0, 1)),
SAMPLE_2_FC = c(0.405, -0.667, 0.156, -0.1372, -0.78, 0.1106, 0.768, rnorm(50000, 0, 1)),
SAMPLE_3_FC = c(0.887, 0.002, 0.112, -0.18, -0.556, 0.0121, 0.997, rnorm(50000, 0, 1)),
SAMPLE_4_FC = c(0.33, 0.124, 0.008, -0.2228, 0.034, -0.0864, 0.467, rnorm(50000, 0, 1)),
SAMPLE_5_FC = c(0.223, 0.356, -0.123, -0.2656, 0.445, -0.1849, -0.776, rnorm(50000, 0, 1)))
# duplicate 30 more columns
mydata2 <- bind_cols(mydata, mydata[2:6], mydata[2:6], mydata[2:6], mydata[2:6], mydata[2:6], mydata[2:6])
(mydata3 <- mydata2 %>% gather(key = "sample_num", value = "fc", 2:length(mydata)) %>%
filter(fc > 0.584963 | fc < -0.584963) %>%
select(X) %>%
arrange(desc(X)) %>%
unique() %>%
head())
#> X
#> 1 GENE_7
#> 5 GENE_5
#> 7 GENE_2
#> 8 GENE_1
#> 10 9999
#> 14 9998
Создано в 2019-03-01 пакетом представлением (v0.2,1)