rowSums错误“ x”必须为数字

时间:2018-06-25 18:26:51

标签: r

我正在尝试将各种列与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 :(得分: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个数字。