将数据集分成四分位数/十分位数,哪种方法是正确的?

23

我是一个R语言的新手,希望能得到一些关于如何操作我的数据的指导。

我的数据数组有三个变量。

  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分成四分位或十分位,然后绘制平均meth_val。

一旦我将数据加载到数据框中...

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

从那里开始,我想根据fpkm_val是否适合这些十分位数之一,将数据框分成10组。然后,我想在ggplot中绘制每个十分位数的meth_val的箱形图,并在十分位数之间执行统计测试。

我真正卡住的主要问题是如何以正确的方式拆分数据集。任何帮助都将不胜感激!

非常感谢!


使用R中的cut函数,并将breaks参数设置为分位数。这里有一个类似的问答:https://dev59.com/Tmgt5IYBdhLWcg3w5xg_ - j1897
3个回答

59

另一种方法是在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

14
也许可以这样简化: data$qunatil = cut( data$fpkm, quantile(data$fpkm, prob = seq(0, 1, length = 11), type = 5) ) 以上代码涉及数据的切割和分位数计算。

1
这似乎会使最小值变成NA。例如,n <- rnorm(20) sum(is.na(cut(n, quantile(n, probs=seq(0, 1, length=11)), type=5))) - Tim Bainbridge

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接