#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 в заголовке: