Вы получаете эту ошибку, потому что значения не 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цифровые цифры.