【问题标题】:How to make 2 histograms of a row from a table using half the n of columns per graph (R)?如何使用每个图 (R) 的一半列 n 从表中制作 2 个行的直方图?
【发布时间】:2019-04-18 10:42:04
【问题描述】:

我需要有关直方图的帮助。我对 R 很陌生,所以我有点迷茫,尽管可能有一种非常简单的方法可以解决这个问题。 我需要编写一个函数,该函数返回使用数据帧的一行中的数据创建的两个直方图。直方图应该出现在同一个图上,一个在另一个之上。 第一个直方图应由第 1 行的 5:39 列和 40:74 列的第二个组成。 我不断得到一个全黑的情节,或者错误“x必须是数字”。

这是数据框的一部分,74的第一列

          gene_id            gene_symbol                      Chr                  Biotype        L001P        L003P        L004P
1     ENSG00000000003                 TSPAN6                        X           protein_coding  3.18003e+01  6.73098e+01  6.30330e+01
2     ENSG00000000005                   TNMD                        X           protein_coding  3.72353e-02  2.28841e+00  3.29320e-02
3     ENSG00000000419                   DPM1                       20           protein_coding  1.75575e+01  4.37474e+01  2.10119e+01
4     ENSG00000000457                  SCYL3                        1           protein_coding  2.68196e+00  3.70790e+00  3.14505e+00
5     ENSG00000000460               C1orf112                        1           protein_coding  5.32179e-01  2.46598e+00  1.11985e+00

这是我到目前为止所做的:

> data <- read.table("file", header=TRUE, stringsAsFactors = FALSE)
 data1 = data[1, 5:39]

这给了我一个包含 5 到 39 列的向量,包括标题。但是,当我尝试绘制第一个直方图时,通过这样做,我得到了一个全黑图

 hist(table(data1), 
     main="Expression levels for TSPAN6 in non-tumor tissue",
     xlab="Patient",
     ylab="Expression level value",
     border = "black",
     col = "black")

我究竟做错了什么? :(

另外,一旦我弄清楚如何绘制它们,我应该如何组合这两个直方图?可以使用

par(mfcol=c(1,2)) 

在>返回函数内部之后?

提前谢谢你!

【问题讨论】:

  • 您需要指定要绘制的数据框的哪一列。我对这个问题有点困惑,你通常会在 R 中绘制列,而不是行。你能提供一个你所期望的例子吗?
  • 这就是我应该做的:“编写一个名为 histogramX 的函数,它会生成两个直方图(排列在两行),其中包含单个基因的表达水平。该函数将数据作为输入, 肿瘤列的索引, 非肿瘤列的索引和要绘制的基因。"现在,非肿瘤列是 5:39 列,每一列代表一个患者的表达水平,每一行代表一个不同的基因。我也很困惑,因为我不完全理解我应该如何隔离 5:39 列的第一行并将这些值视为一列。

标签: r function histogram


【解决方案1】:

我认为这是因为每个元素都是独一无二的,例如在你的小例子中

`

table( as.numeric( data1))

31.8003       63.033      67.3098 
      1            1             1

`

这就像均匀分布,因此您的问题图 (只存在一个频率)

我创建数据并举出我自己的例子

data=cbind(matrix(NA,5,4),rbind(
abs(rnorm(70,54,19)),
abs(rnorm(70,0.78,1.3)),
abs(rnorm(70,27,14)),
abs(rnorm(70,3.1,0.51)),
abs(rnorm(70,1.3,0.99))
))
for (i in seq(nrow(data))) {

    win.graph()

    par(mfcol=c(1,2)) 

    data1 = data[i, 5:39]

    hist(as.numeric(data1), 
        main="Expression levels for TSPAN6 in non-tumor tissue",
        xlab="Patient",
        ylab="Expression level value",
        border = "black",
        col = "black")

    data2 = data[i, 40:74]

    hist(as.numeric(data2), 
        main="Expression levels for TSPAN6 in non-tumor tissue",
        xlab="Patient",
        ylab="Expression level value",
        border = "black",
        col = "black")

}

如果你想做一件或一件,你可以这样做

win.graph()

    par(mfcol=c(1,2)) 

    data1 = data[1, 5:39]

    hist(as.numeric(data1), 
        main="Expression levels for TSPAN6 in non-tumor tissue",
        xlab="Patient",
        ylab="Expression level value",
        border = "black",
        col = "black")

    data2 = data[1, 40:74]

    hist(as.numeric(data2), 
        main="Expression levels for TSPAN6 in non-tumor tissue",
        xlab="Patient",
        ylab="Expression level value",
        border = "black",
        col = "black")

如果你想在你的情况下做所有行,我认为这段代码必须起作用,

`

for (i in seq(nrow(data))) {

    win.graph()

    par(mfcol=c(1,2)) 

    data1 = data[i, 5:39]

    hist(as.numeric(data1), 
        main="Expression levels for TSPAN6 in non-tumor tissue",
        xlab="Patient",
        ylab="Expression level value",
        border = "black",
        col = "black")

    data2 = data[i, 40:74]

    hist( as.numeric( data2),        
        main="Expression levels for TSPAN6 in non-tumor tissue",
        xlab="Patient",
        ylab="Expression level value",
        border = "black",
        col = "black") 

}

`

【讨论】:

    【解决方案2】:

    因为您的数据是宽格式的,所以只需将您的单行数值转换为数值向量,而不是传递到直方图。无需运行table,它会创建一个非常深、嵌套且密集的数组,其级别等于列数!

    调整下方以在需要的函数内部运行,参数输入为gene_id,列索引为肿瘤/非肿瘤列。

    gene_param = "ENSG00000000003"
    
    hist(as.numeric(data[data$gene_id==gene_param, 5:39]), 
         main=paste("Espression levels for TSPAN6\nin non-tumor tissue for gene,", gene_param),
         xlab="Patient", breaks=50,
         ylab="Espression level value",
         border = "black",
         col = "black")
    
    hist(as.numeric(data[data$gene_id==gene_param, 40:74]), 
         main=paste("Espression levels for TSPAN6\nin tumor tissue for gene,", gene_param),
         xlab="Patient",
         ylab="Espression level value",
         border = "black",
         col = "black")
    

    以下数据补充了 74 列之前的随机数据:

    txt <- '          gene_id            gene_symbol                      Chr                  Biotype        L001P        L002P        L003P
    1     ENSG00000000003                 TSPAN6                        X           protein_coding  3.18003e+01  6.73098e+01  6.30330e+01
    2     ENSG00000000005                   TNMD                        X           protein_coding  3.72353e-02  2.28841e+00  3.29320e-02
    3     ENSG00000000419                   DPM1                       20           protein_coding  1.75575e+01  4.37474e+01  2.10119e+01
    4     ENSG00000000457                  SCYL3                        1           protein_coding  2.68196e+00  3.70790e+00  3.14505e+00
    5     ENSG00000000460               C1orf112                        1           protein_coding  5.32179e-01  2.46598e+00  1.11985e+00'
    
    data <- read.table(text=txt, header=TRUE)
    
    # ADDING COLUMNS OF RANDOM DATA
    set.seed(41719)
    data[paste0("LOO", 4:74, "P")] <- replicate(71, abs(rnorm(5))+10)
    

    histogram 调用之上运行,下面的图是用标题中的 gene_id 生成的:

    【讨论】:

      猜你喜欢
      • 2021-11-30
      • 2017-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-02
      • 2020-10-19
      • 1970-01-01
      • 2014-04-11
      相关资源
      最近更新 更多