Ошибка rowSums 'x' должна быть числовой - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь добавить различные столбцы вместе с rowSums, но у меня возникли некоторые проблемы.Вот список имен столбцов:

colnames(No_Low_No_Intergenic_snpeff)

"CHROM" "POS"   "REF"   "ALT"   "QUAL"  "ANN.ALLELE"    "ANN.EFFECT"
"ANN.IMPACT"    "ANN.GENE"  "ANN.GENEID"    "ANN.FEATURE"   "ANN.FEATUREID"
"ANN.HGVS_C"    "ANN.HGVS_P"    "ANN.ERRORS"    "GEN.C02141.GT" "GEN.C00611.GT"
"GEN.C00633.GT" "GEN.C00634.GT" "GEN.C00644.GT" "GEN.C00647.GT" "GEN.C00648.GT"
"GEN.C00649.GT" "GEN.C00650.GT" "GEN.C00653.GT" "GEN.C00655.GT" "GEN.C00656.GT"
"GEN.C00657.GT" "GEN.C00659.GT" "GEN.C00682.GT" "GEN.C00705.GT" "GEN.C00707.GT"
"GEN.C00720.GT" "GEN.C00783.GT" "GEN.C01431.GT" "GEN.C01944.GT" "GEN.C01943.GT"
"GEN.C01403.GT" "GEN.C01158.GT" "GEN.C01157.GT" "GEN.C01156.GT" "GEN.C01033.GT"
"GEN.C00736.GT" "GEN.C00639.GT" "GEN.C99686.GT"

Все столбцы, с которыми я работаю, помечены GEN.Cxxxxx.GT, и все значения в этих столбцах находятся в диапазоне 0-2.Я пытаюсь суммировать столбцы 20:29 и 45, а затем помещаю значения в новый столбец с именем controls:

No_Low_No_Intergenic_snpeff.scores$controls <- rowSums(No_Low_No_Intergenic_snpeff.scores[,20:29,45])

, но когда я пытаюсь выполнить эту команду, я получаю следующую ошибку:

Error in rowSums(No_Low_No_Intergenic_snpeff.scores[, 20:29, 45]) : 'x' must be numeric

Данные

str(No_Low_No_Intergenic_snpeff.scores)

'data.frame':   1000 obs. of 11 variables:
$ GEN.C00644.GT: Factor w/ 3 levels "0","1","2": 3 1 1 3 3 3 2 1 3 1 ...
$ GEN.C00647.GT: Factor w/ 3 levels "0","1","2": 3 1 3 3 2 2 2 1 2 1 ...
$ GEN.C00648.GT: Factor w/ 3 levels "0","1","2": 3 1 1 3 3 3 1 1 2 1 ...
$ GEN.C00649.GT: Factor w/ 3 levels "0","1","2": 3 1 1 3 2 2 2 1 2 1 ...
...

1 Ответ

0 голосов
/ 25 июня 2018

Вы получаете эту ошибку, потому что значения не numeric.Посмотрите на ваш вывод из str:

GEN.C00650.GT: Factor w/ 3 levels "0","1","2": 3 1 3 3 3 3 1 1 3 1 ... 

Это класс factor, а не класс numeric.Чтобы работать с ними как с числами, вам необходимо преобразовать их в числа, используя as.numeric

Если вы можете снова импортировать данные:

Если вы можете импортировать данныеиз файла снова, вы можете сделать это с аргументом stringsAsFactors = FALSE.Вы должны почти всегда использовать этот аргумент, поскольку без него все строки (и большинство чисел, как вы видите здесь) будут преобразованы в факторы, создающие всевозможные раздражающие проблемы, пока вы не вернете их обратно.

Base R

Самый простой способ сделать это - использовать sapply:

rowSums(sapply(No_Low_No_Intergenic_snpeff.scores[, c(20:29, 45)], as.numeric))

Это подмножество вашего data.frame, применяет функцию as.numeric к каждой строке, а затем вычисляет rowSums.

tidyverse

Вы также можете использовать функцию mutate_if из dplyr для преобразования всех факторных переменных в числовые.

library(dplyr)

No_Low_No_Intergenic_snpeff.scores <- No_Low_No_Intergenic_snpeff.scores %>%
    mutate_if(is.factor, as.numeric)

rowSums(No_Low_No_Intergenic_snpeff.scores[, c(20:29, 45)])

АльтернативноВы можете использовать mutate_at для выбора столбцов по позиции или имени.Прочитайте ?select, чтобы увидеть разные способы выбора столбцов.Вы можете даже использовать регулярное выражение с matches, как показано ниже:

No_Low_No_Intergenic_snpeff.scores <- No_Low_No_Intergenic_snpeff.scores %>%
    mutate_at(vars(matches('GEN.C\\d{5}.GT')), funs(as.numeric))

Это применяет функцию as.numeric ко всем столбцам, имена которых соответствуют регулярному выражению GEN.C\\d{5}.GT, где \\d{5} представляет 5цифровые цифры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...