2014-10-09 2 views
5

저는 R이 매우 새롭기 때문에 원하는 데이터 조작 방법을 알려주고 싶습니다.R : 데이터 세트를 사 분위수/십진수로 나눕니다. 올바른 방법은 무엇입니까?

나는 3 개의 변수가있는 데이터 배열을 가지고 있습니다.

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

fpkm를 기준으로 내 gene_ids를 4 분위수 또는 십진수로 계층화 한 후 평균 meth_val을 플로팅하고 싶습니다.

나는 dataframe에 내 데이터를로드하면 ...

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

나는 fpkm를 확인할 수 있습니다 사용하여 분위 :

거기에서

  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 

를 산출

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

하는 I fpkm_val이 이러한 십진수 중 하나에 들어 맞는지에 따라 본질적으로 데이터 프레임을 10 개의 그룹으로 나누고 싶습니다. 그런 다음 ggplot에있는 각 십 분위수의 meth_val을 상자 플롯으로 플롯하고 십진법에 걸쳐 통계 테스트를 수행하고 싶습니다.

내가 정말로 고집하는 주요한 점은 적절한 방식으로 데이터 세트를 분할하는 방법입니다. 어떤 도움이라도 대단히 감사하겠습니다!

감사합니다.

+0

R에서 cut 함수를 사용하여 나누기 인수를 quantiles로 설정하십시오. 유사한 Q & A가 있습니다. http://stackoverflow.com/questions/11728419/using-cut-and-quartile-to-generate-breaks-in-r-function – technOslerphile

답변

13

또 다른 방법은 dplyr에서 ntile() 될 것이다.

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

Hmisc 라이브러리 및 cut2 기능을 사용해 볼 수 있습니다. 절단 점을 말하면 벡터를 다른 그룹으로 절단 할 수 있습니다. 다음은 예입니다

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)) 

그리고 당신은 분할을위한 추가 열이 동일한 데이터 프레임을 얻을 것이다 :

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) 
... 

은 또한 너무 분위 그룹에 의해 cut2 지정을 사용하여 절단 할 수 있습니다. 더 읽기 ?cut2. 이 같은

4

아마도 쉽게 :

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

관련 문제