2014-10-09 2 views
5

Sono molto nuovo con R, quindi spero di poter ottenere alcuni suggerimenti su come ottenere la manipolazione desiderata dei miei dati.R: suddivisione del set di dati in quartili/decili. Qual è il metodo giusto?

Ho una matrice di dati con tre variabili.

gene_id  fpkm meth_val 
1 100629094  0.000 0.0063 
2 100628995  0.000 0.0000 
3 102655614 111.406 0.0021 

vorrei tracciare la meth_val media dopo stratificazione miei gene_ids sulla base di fpkm in quartili o decili.

Una volta che carico i miei dati in un dataframe ...

data <- read.delim("myfile.tsv", sep='\t') 

posso determinare il fpkm decili utilizzando:

quantile(data$fpkm, prob = seq(0, 1, length = 11), type = 5 

che produce

  0%   10%   20%   30%   40%   50% 
0.000000e+00 9.783032e-01 7.566164e+00 3.667630e+01 1.379986e+02 3.076280e+02 
     60%   70%   80%   90%   100% 
5.470552e+02 8.875592e+02 1.486200e+03 2.974264e+03 1.958740e+05 

Da lì, ho 'Mi piacerebbe dividere in due il dataframe in 10 gruppi in base al fatto che fpkm_val si adatti a uno di questi decili. Poi mi piacerebbe tracciare il meth_val di ogni decile in ggplot come un diagramma a riquadri ed eseguire un test statistico attraverso i decili.

La cosa principale su cui sono davvero bloccato è come suddividere il set di dati nel modo corretto. Qualsiasi assistenza sarebbe molto apprezzata!

Grazie mille!

+0

Utilizzare la funzione di taglio in R con l'argomento di interruzione impostato sui quantili. Ecco una domanda simile Q & A http://stackoverflow.com/questions/11728419/using-cut-and-quartile-to-generate-breaks-in-r-function – technOslerphile

risposta

13

Un altro modo sarebbe ntile() in dplyr.

library(tidyverse) 

foo <- data.frame(a = 1:100, 
        b = runif(100, 50, 200), 
        stringsAsFactors = FALSE) 

foo %>% 
    mutate(quantile = ntile(b, 10)) 

# a   b quantile 
#1 1 93.94754  2 
#2 2 172.51323  8 
#3 3 99.79261  3 
#4 4 81.55288  2 
#5 5 116.59942  5 
#6 6 128.75947  6 
2

puoi provare a utilizzare la libreria Hmisc e la funzione cut2. È possibile tagliare il vettore in diversi gruppi affermando i punti di divisione. Ecco un esempio:

library(Hmisc) 
data <- data.frame(gene_id=sample(c("A","B","D", 100), 100, replace=TRUE), 
       fpkm=abs(rnorm(100, 100, 10)), 
       meth_val=abs(rnorm(100, 10, 1))) 
quantiles <- quantile(data$fpkm, prob = seq(0, 1, length = 11), type = 5) 
data$cutted <- cut2(data$fpkm, cuts = as.numeric(quantiles)) 

E si otterrà lo stesso frame di dati con colonne aggiuntive per la spaccatura:

gene_id  fpkm meth_val  cutted 
1   B 102.16511 8.477469 [100.4,103.2) 
2   A 110.59269 9.256172 [106.4,110.9) 
3   B 93.15691 10.560936 [ 92.9, 95.3) 
4   B 105.74879 10.301358 [103.2,106.4) 
5   A 96.12755 11.336484 [ 95.3, 96.8) 
6   B 106.29204 8.286120 [103.2,106.4) 
... 

Inoltre è possibile tagliare utilizzando cut2 specificare da parte di gruppi quantili troppo. Maggiori informazioni ?cut2.

4

forse più facile in questo modo:

data$qunatil = cut(data$fpkm, quantile(data$fpkm, prob = seq(0, 1, length = 11), type = 5))