【问题标题】:R: splitting dataset into quartiles/deciles. What is the right method? [duplicate]R:将数据集分成四分位数/十分位数。什么是正确的方法? [复制]
【发布时间】:2014-10-09 08:37:34
【问题描述】:

我对 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 plot dataframe


【解决方案1】:

另一种方式是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】:

    也许像这样更容易:

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

    【讨论】:

    • 这似乎使最小值变为NA。例如,n &lt;- rnorm(20)sum(is.na(cut(n, quantile(n, probs=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))
    

    您将获得相同的数据框,其中包含用于拆分的附加列:

        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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多