我正在尝试将各种列与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 ...
...
答案 0 :(得分:2)
您收到此错误,因为值不是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
参数来实现。您几乎应该始终使用此参数,因为如果没有该参数,所有字符串(以及大多数数字,如您在此处看到的)都将转换为会产生各种烦人问题的因素,直到您将其改回为止。
基本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个数字。