Как сделать 2 гистограммы строки из таблицы, используя половину n столбцов на график (R)?

#r #function #histogram

#r #функция #гистограмма

Вопрос:

Мне нужна помощь с гистограммами. Я очень новичок в R, поэтому я немного потерялся, хотя, вероятно, есть очень простой способ решить эту проблему. Мне нужно написать функцию, которая возвращает две гистограммы, созданные с данными из одной строки фрейма данных. Гистограммы должны отображаться на одном графике, одна над другой. Первая гистограмма должна состоять из столбцов 5: 39 из строки 1, вторая из столбцов 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)) 
  

после> возврата внутри функции?

Заранее спасибо!

Комментарии:

1. Вам нужно указать, какой столбец фрейма данных вы хотите отобразить. Я немного смущен вопросом, обычно вы строите столбцы в R, а не строки. Можете ли вы привести пример того, что вы ожидаете?

2. Это то, что я должен делать: «Напишите функцию с именем histogramX, которая создает две гистограммы (расположенные в двух строках) с уровнями экспрессии для одного гена. Функция принимает в качестве входных данных данные, индексы столбцов опухоли, индексы неопухолевых столбцов и ген, который будет нанесен на график. » Теперь неопухолевыми столбцами являются столбцы 5: 39, каждый столбец представляет уровень экспрессии для одного пациента, каждая строка — один отдельный ген. Я также в замешательстве, потому что я не совсем понимаю, как я должен изолировать первую строку столбцов 5: 39 и обрабатывать эти значения как столбец.

Ответ №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 TSPAN6nin 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 TSPAN6nin 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 в заголовке:

Вывод графика