J'utilise le package dplyr
dans R pour filtrer mes données d'expressions génétiques. J'ai calculé les changements de plis et je souhaite filtrer les gènes (lignes) dans lesquels au moins un échantillon (colonnes) a une valeur supérieure à +0,584963 OU inférieure à -0,584963.Un exemple de données:
X SAMPLE_1_FC SAMPLE_2_FC SAMPLE_3_FC SAMPLE_4_FC SAMPLE_5_FC GENE_1 0.6780 0.4050 0.8870 0.3300 0.2230 GENE_2 0.2340 -0.6670 0.0020 0.1240 0.3560 GENE_5 -0.8080 -0.7800 -0.5560 0.0340 0.4450 GENE_7 0.5980 0.7680 0.9970 0.4670 -0.7760
J'utilise actuellement le script suivant
det.cols<- colnames(my.data)[which(grepl("fc",tolower(colnames(my.data))))] filt <- gsub(","," | ",toString(paste("`",det.cols,"`",">abs(0.584963)", sep = ""))) my.datasub<- my.data %>% filter_(filt)
mais cela ne renvoie que les gènes supérieurs à +0,584963 et non les gènes négatifs. Dans le cas de l'exemple, ce que je veux, c'est une liste sous-ensemble avec les gènes 1, 2, 5 et 7. Mais à la place, cela ne me donne que les gènes 1 et 7. Comment puis-je changer cela?
Je m'attends à ce que la réponse soit dans ce format:
X SAMPLE_1_FC SAMPLE_2_FC SAMPLE_3_FC SAMPLE_4_FC SAMPLE_5_FC GENE_1 0.6780 0.4050 0.8870 0.3300 0.2230 GENE_2 0.2340 -0.6670 0.0020 0.1240 0.3560 GENE_3 0.0170 0.1560 0.1120 0.0080 -0.1230 GENE_4 -0.0944 -0.1372 -0.1800 -0.2228 -0.2656 GENE_5 -0.8080 -0.7800 -0.5560 0.0340 0.4450 GENE_6 0.2091 0.1106 0.0121 -0.0864 -0.1849 GENE_7 0.5980 0.7680 0.9970 0.4670 -0.7760
Merci.
3 Réponses :
Utiliser filter_at
de dplyr
pourrait être une approche encore plus flexible ...
# set up sample data with 50000 rows [as proposed by Arthur Yip above] mydata <- tibble(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 [as proposed by Arthur Yip above] mydata2 <- bind_cols(mydata, mydata[2:6], mydata[2:6], mydata[2:6], mydata[2:6], mydata[2:6], mydata[2:6]) mydata2 %>% filter_at(vars(contains("fc")), .vars_predicate = any_vars(abs(.) > 0.584963))
Dans le vars ()
vous pouvez définir votre liste de variables auxquelles vous souhaitez appliquer le filtrage. En suivant .vars_predicate
, vous pouvez définir le critère de filtre ( any_vars
est égal à |
, all_vars
est égal à &
).
Merci ha_pu pour la réponse et désolé je n'ai pas été clair sur la question. J'ai maintenant édité ma question et ajouté un exemple de données. J'ai plusieurs colonnes et je souhaite extraire une ligne dans laquelle au moins une des colonnes a> 0,584963 ou <-0,584963.
Merci pour les clarifications, j'ai adapté ma réponse en conséquence.
Sayan veut les colonnes avec "fc" afin que nous puissions dire filter_at (vars (contains ("fc")), ... qui est fondamentalement une version beaucoup plus simple du grepl et du fichier personnalisé qui était dans le message d'ouverture.
Selon vos besoins, vous pouvez également utiliser matches () dans l'expression wars (), ce qui permet d'utiliser regex, ce qui rend votre sélection de variables encore plus flexible ...
Voici une solution flexible en fonction du nombre d'échantillons et de lignes de données. Il s'agit de transformer les données en format long, puis de filtrer le gène et l'échantillon spécifique. Je l'ai testé sur 50 000 gènes et 35 échantillons, et il a fonctionné en <1 seconde.
XXX
Créé le 2019-03-01 par le paquet reprex (v0.2.1)
Cela donne le résultat mais le format du résultat serait encore difficile à travailler. J'attends un résultat avec une table ayant les mêmes colonnes mais juste les gènes rétrécis. J'ai fait cela pour réduire les gènes avec pval <0,05 mais ce n'était qu'une exigence, donc c'était bien, contrairement à ici pour fc où j'ai deux exigences <-0,584963 et> 0,584963.
pour l'instant, le code produit une colonne avec tous les noms de gènes. De quoi avez-vous besoin / attendez-vous?
Je viens de rééditer la question avec le format attendu car je ne savais pas comment la mettre dans le commentaire
Pour faire court, vous aviez le abs ()
au mauvais endroit dans votre code.
Je l'ai corrigé ici:
det.cols<- colnames(my.data)[which(grepl("fc",tolower(colnames(my.data))))] filt <- gsub(","," | ",toString(paste("abs(`",det.cols,"`)",">0.584963", sep = ""))) my.datasub<- my.data %>% filter_(filt)
Pour plus de flexibilité, @ha_pu a fourni une excellente solution filter_at
en s'appuyant sur ma solution précédente (avant que j'identifie l'erreur dans votre code).
veuillez fournir quelques exemples de données pour un exemple entièrement reproductible. Merci!
Merci Arthur Yip. J'ai édité la question. J'espère que cela aide.
Oh, j'ai finalement repéré l'erreur mineure dans votre code. Je l'ai corrigé dans la réponse ci-dessous.
Il semble que le code de filtre personnalisé provienne de stackoverflow.com/questions/43981187/... - serait utile la prochaine fois pour créer un lien vers le matériel source