Ошибка при отображении СИМВОЛОВ в 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) доступен для управления этим поведением, но я не рекомендую его использовать. Изменение глобального параметра может иметь неожиданные последствия при объединении с другим кодом (либо из пакетов, либо с кодом, который вы используете ()), а глобальные параметры затрудняют понимание кода, поскольку они увеличивают количество строк, которые необходимо прочитать понять, как будет вести себя одна строка кода....

Другие вопросы по тегам