Ошибка при отображении СИМВОЛОВ в ENTREZID
Я получаю странную ошибку при преобразовании символов гена в Entrez ID. Вот мой код:
testData = read.delim("IL_CellVar.txt",head=T,row.names = 2)
testData[1:5,1:3]
# ClustID Genes.Symbol ChrLoc
# NM_001034168.1 4 Ank2 chrNA:-1--1
# NM_013795.4 4 Atp5l chrNA:-1--1
# NM_018770 4 Igsf4a chrNA:-1--1
# NM_146150.2 4 Nrd1 chrNA:-1--1
# NM_134065.3 4 Epdr1 chrNA:-1--1
clustNum = 5
filteredClust = testData[testData$ClustID == clustNum,]
any(is.na(filteredClust$Genes.Symbol))
# [1] FALSE
selectedEntrezIds <- unlist(mget(filteredClust$Genes.Symbol,org.Mm.egSYMBOL2EG))
# Error in unlist(mget(filteredClust$Genes.Symbol, org.Mm.egSYMBOL2EG)) :
# error in evaluating the argument 'x' in selecting a method for function
# 'unlist': Error in #.checkKeysAreWellFormed(keys) :
# keys must be supplied in a character vector with no NAs
Другой подход тоже терпит неудачу:
selectedEntrezIds = select(org.Mm.eg.db,filteredClust$Genes.Symbol, "ENTREZID")
# Error in .select(x, keys, columns, keytype = extraArgs[["kt"]], jointype = jointype) :
# 'keys' must be a character vector
Просто ради или ошибки, удаление "NA" не помогает:
a <- filteredClust$Genes.Symbol[!is.na(filteredClust$Genes.Symbol)]
selectedEntrezIds <- unlist(mget(a,org.Mm.egSYMBOL2EG))
# Error in unlist(mget(a, org.Mm.egSYMBOL2EG)) :
# error in evaluating the argument 'x' in selecting a method for function
# 'unlist': Error in # .checkKeysAreWellFormed(keys) :
# keys must be supplied in a character vector with no NAs
Я не уверен, почему я получаю эту ошибку, поскольку основной файл, из которого были извлечены генные символы для testData, не создает проблем при преобразовании в EntrezID. Буду признателен за помощь в этом.
1 ответ
Поскольку вы не предоставили нам минимальный воспроизводимый пример для репликации возникшей ошибки, я делаю предположение здесь на основе сообщения об ошибке. Это, скорее всего, вызвано поведением по умолчанию read.delim
и функции одинаковые (read.csv
, read.table
и т.д.), который преобразует строки в вашем файле данных в factor
"S.
Вам нужно добавить дополнительный параметр в read.delim
конкретно stringsAsFactors=F
(по умолчанию это TRUE
).
То есть,
testData = read.delim("IL_CellVar.txt", head=T, row.names = 2, stringsAsFactors=F)
Если вы читаете документацию:
stringsAsFactors
логично: следует ли преобразовывать векторы символов в факторы? Обратите внимание, что это отменяется as.is и colClasses, оба из которых позволяют более точное управление.
Вы можете проверить class
вашей Gene.symbol
колонка по:
class(testData$Gene.Symbol)
и я думаю, это будет "factor"
,
Это приводит к вашей ошибке:
# Error in .select(x, keys, columns, keytype = extraArgs[["kt"]], jointype = jointype) :
# 'keys' must be a character vector
Вы также можете вручную преобразовать факторы в строки / символы:
testData$Gene.Symbol <- as.character(testData$Gene.Symbol)
Вы можете прочитать больше об этом специфическом поведении в этой главе книги Хэдли "Advanced R". И я цитирую соответствующий абзац здесь:
... К сожалению, большинство функций загрузки данных в R автоматически конвертируют символьные векторы в факторы. Это неоптимально, потому что у этих функций нет возможности узнать множество всех возможных уровней или их оптимальный порядок. Вместо этого используйте аргумент stringsAsFactors = FALSE для подавления этого поведения, а затем вручную преобразуйте векторы символов в факторы, используя ваши знания данных. Глобальный параметр options(stringsAsFactors = FALSE) доступен для управления этим поведением, но я не рекомендую его использовать. Изменение глобального параметра может иметь неожиданные последствия при объединении с другим кодом (либо из пакетов, либо с кодом, который вы используете ()), а глобальные параметры затрудняют понимание кода, поскольку они увеличивают количество строк, которые необходимо прочитать понять, как будет вести себя одна строка кода....