R: разбиение набора данных на квартили/децили. Каков правильный метод?
Я очень новичок в R, поэтому надеюсь, что смогу получить некоторые указания относительно того, как добиться желаемой манипуляции с моими данными.
У меня есть массив данных с тремя переменными.
gene_id fpkm meth_val
1 100629094 0.000 0.0063
2 100628995 0.000 0.0000
3 102655614 111.406 0.0021
Я хотел бы построить средний met_val после расслоения моих gene_ids на основе fpkm на квартили или децили.
Как только я загружу свои данные в dataframe...
data <- read.delim("myfile.tsv", sep='\t')
Я могу определить децили fpkm, используя:
quantile(data$fpkm, prob = seq(0, 1, length = 11), type = 5
что дает
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
Оттуда я хотел бы по существу разделить dataframe на 10 групп на основе того, вписывается ли fpkm_val в один из этих децилей. Затем я хотел бы построить met_val каждого дециля в ggplot в виде графика и выполнить статистический тест по децилям.
Главное, на что я действительно застрял, - как правильно разбить мой набор данных. Любая помощь была бы чрезвычайно оценена!
Спасибо, куча!
Ответы
Ответ 1
Другим способом будет ntile()
в 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
Возможно, проще:
data$qunatil = cut( data$fpkm, quantile(data$fpkm, prob = seq(0, 1, length = 11), type = 5) )
Ответ 3
вы можете попробовать использовать библиотеку 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))
И вы получите тот же фрейм данных с дополнительными столбцами для split:
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
.