【问题标题】:rowSums error 'x' must be numericrowSums 错误“x”必须是数字
【发布时间】:2018-12-04 09:39:07
【问题描述】:

我正在尝试将各种列与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 ...
...

【问题讨论】:

  • 你有一个错误:rowSums(No_Low_No_Intergenic_snpeff.scores[,c(20:29,45)])需要将20:29, 45包裹在c()
  • 那也没有做到No_Low_No_Intergenic_snpeff.scores$controls &lt;- rowSums(No_Low_No_Intergenic_snpeff.scores[,c(20:29,45)])Error in rowSums(No_Low_No_Intergenic_snpeff.scores[, c(20:29, 45)]) : 'x' must be numeric
  • 您确定这些列中的所有值都是numeric,而不是包含数字的factorcharacter 值吗?提供str(No_Low_No_Intergenic_snpeff.scores[, c(20:29, 45)]) 的输出可能会有所帮助
  • 请发布您的实际数据样本,而不仅仅是列名。否则我们只是猜测打字问题是什么。但正如@emilliman5 所说,R 中的正确索引采用data[, c(1, 3, 5:7)] 的形式,而不是data[, 1, 3, 5:7]
  • @Brian 我已将您的str 输出添加到问题中。将来,应将附加信息添加为问题的编辑,而不是 cmets。要发布数据,请使用 dput 函数。您应该阅读此页面以了解如何提出一个可以快速获得良好答案的好问题:stackoverflow.com/questions/5963269/…

标签: r


【解决方案1】:

您收到此错误是因为值不是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 4.0.0, this is no longer necessarystringsAsFactors 的默认值已更改为FALSE。希望这将使这个常见的错误成为过去

否则,从因子变回数字:

基础 R

最简单的方法是使用sapply

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

这对您的 data.frame 进行子集化,将 as.numeric 函数应用于每一行,然后计算 rowSums

tidyverse

您还可以使用dplyr 中的mutate_if 函数将所有因子变量转换为数值。

library(dplyr)

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

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 个数字。

【讨论】:

  • 嗯,这很有意义。让我快速尝试一下
  • 有没有办法让 dyplyr 只更改选择列?现在它正在将我所有的数据更改为 as.numeric
  • @Brian 是的,mutate_at 按名称或位置指定列,或mutate_if 基于谓词指定列,如上所示
猜你喜欢
  • 1970-01-01
  • 2018-12-14
  • 2014-07-27
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
  • 2019-01-08
  • 2022-01-05
相关资源
最近更新 更多