【问题标题】:Error in colMeans(x, na.rm = TRUE) : 'x' must be numericcolMeans(x, na.rm = TRUE) 中的错误:“x”必须是数字
【发布时间】:2020-12-19 03:50:49
【问题描述】:

我正在尝试进行聚类分析,这需要我扩展/标准化我的数据。数据在矩阵中并且是数字,但是我只收到以下消息:

Error in colMeans(x, na.rm = TRUE) : 'x' must be numeric

最初,有一列包含分类数据,所以我删除了它,认为这样可以解决问题,但我仍然收到错误。

以下是脚本块和 6 行数据。任何帮助将不胜感激。

Metals <- as.matrix(d)
rownames(Metals)<-d$RowLabs
cols_to_keep <-c(FALSE,TRUE,TRUE,TRUE,TRUE,TRUE) 
Metals<-Metals[,cols_to_keep]
head(Metals)
    X88Sr_umol_molCa X25Mg_umol_molCa X55Mn_umol_molCa X7Li_umol_molCa
CHR1 "1748.3722"      "    80.284613"  " 1.353754e-01"  "   3.2146056" 
CLR2 "1763.6984"      "   104.850260"  " 4.944963e-01"  "   0.2649073" 
CLR3 "2245.8861"      "   186.579911"  " 2.124642e-01"  "   1.0715352" 
CLR4 "1654.9811"      "   124.502777"  " 4.756491e-01"  "   0.2252010" 
CLR5 "1447.3079"      "   183.703436"  " 4.734605e-01"  "   2.8409970" 
CLR6 "1731.3718"      "   170.511088"  " 1.728970e-01"  "   2.5984728" 
     X138Ba_umol_molCa
CHR1 " 1.3426978"     
CLR2 "10.3955650"     
CLR3 "12.8552971"     
CLR4 "12.3339241"     
CLR5 " 0.9453284"     
CLR6 " 2.1714244" 
d <- scale(Metals)
head(Metals)

colMeans(x, na.rm = TRUE) 中的错误:“x”必须是数字

【问题讨论】:

  • 嘿安吉拉!从您提供的 6 行数据来看,您的数字似乎被 R 解释为字符(因为它们位于引号 - “”之间)。也许这就是出现错误的原因。您可以通过应用 as.double() 函数来转换这些数字。
  • 除此之外。下次您寻求帮助时,请在您的“d”对象上使用 dput() 函数,以提供重现数据的正确方法。您提供的 6 行数据,对我们解决您的问题没有多大帮助。
  • 感谢您的帮助佩德罗。我不确定为什么它们用引号引起来。如何删除它们?
  • 我只是编辑了过去的评论。您可以在您的“d”对象上使用 as.double() 函数,这可能有效。
  • 感谢您也让我了​​解 dput() 函数。这看起来如何?你能告诉我我提供的代码吗?

标签: r cluster-analysis


【解决方案1】:

您的数据似乎是字符。 class(Metals) 返回什么?

把数据转成数字,然后试试scale函数:

Metals[] <- as.numeric(Metals)
d <- scale(Metals)

【讨论】:

    【解决方案2】:

    表格被错误读入,您可以看到例如在“X25Mg_umol_molCa”列下,您的条目是字符串并且有一个前导空格,例如“80.284613”。

    您的文件中很可能有一些条目导致它被这样读取,而不是作为数字列读取。我认为您应该首先尝试使用例如:

    df = read.table(<file>,header=TRUE,sep="\t")
    str(df)
    

    并查看列现在是否为数字。

    使用您当前的几行,我们可以做一些事情来删除空格,希望它可以解决问题:

    df = structure(c("1748.3722", "1763.6984", "2245.8861", "1654.9811", 
    "1447.3079", "1731.3718", "    80.284613", "    104.85026", "   186.579911", 
    "   124.502777", "   183.703436", "   170.511088", " 1.353754e-01", 
    " 4.944963e-01", " 2.124642e-01", " 4.756491e-01", " 4.734605e-01", 
    " 1.728970e-01", "   3.2146056", "   0.2649073", "   1.0715352", 
    "   0.2252010", "   2.8409970", "   2.5984728", " 1.3426978", 
    "10.3955650", "12.8552971", "12.3339241", " 0.9453284", " 2.1714244"
    ), .Dim = 6:5, .Dimnames = list(NULL, c("X88Sr_umol_molCa", "X25Mg_umol_molCa", 
    "X55Mn_umol_molCa", "X7Li_umol_molCa", "X138Ba_umol_molCa")))
    
     df
         X88Sr_umol_molCa X25Mg_umol_molCa X55Mn_umol_molCa X7Li_umol_molCa
    [1,] "1748.3722"      "    80.284613"  " 1.353754e-01"  "   3.2146056" 
    [2,] "1763.6984"      "    104.85026"  " 4.944963e-01"  "   0.2649073" 
    [3,] "2245.8861"      "   186.579911"  " 2.124642e-01"  "   1.0715352" 
    [4,] "1654.9811"      "   124.502777"  " 4.756491e-01"  "   0.2252010" 
    [5,] "1447.3079"      "   183.703436"  " 4.734605e-01"  "   2.8409970" 
    [6,] "1731.3718"      "   170.511088"  " 1.728970e-01"  "   2.5984728" 
         X138Ba_umol_molCa
    [1,] " 1.3426978"     
    [2,] "10.3955650"     
    [3,] "12.8552971"     
    [4,] "12.3339241"     
    [5,] " 0.9453284"     
    [6,] " 2.1714244"
    
    df = apply(gsub(" ","",df),2,as.numeric)
    scale(df)
    
         X88Sr_umol_molCa X25Mg_umol_molCa X55Mn_umol_molCa X7Li_umol_molCa
    [1,]     -0.064262779       -1.3718203       -1.1268227       1.1249317
    [2,]     -0.005975399       -0.8234489        0.9806457      -1.0696716
    [3,]      1.827842350        1.0009771       -0.6744341      -0.4695329
    [4,]     -0.419440351       -0.3847518        0.8700426      -1.0992135
    [5,]     -1.209246479        0.9367664        0.8571990       0.8469633
    [6,]     -0.128917342        0.6422776       -0.9066306       0.6665231
         X138Ba_umol_molCa
    [1,]        -0.9263654
    [2,]         0.6466464
    [3,]         1.0740455
    [4,]         0.9834525
    [5,]        -0.9954117
    [6,]        -0.7823672
    attr(,"scaled:center")
     X88Sr_umol_molCa  X25Mg_umol_molCa  X55Mn_umol_molCa   X7Li_umol_molCa 
         1765.2695833       141.7386808         0.3273904         1.7026198 
    X138Ba_umol_molCa 
            6.6740395 
    attr(,"scaled:scale")
     X88Sr_umol_molCa  X25Mg_umol_molCa  X55Mn_umol_molCa   X7Li_umol_molCa 
          262.9419965        44.7974607         0.1704039         1.3440690 
    X138Ba_umol_molCa 
            5.7551172 
    

    【讨论】:

      【解决方案3】:

      R 上的矩阵是二维向量,因此通过直接应用 as.double() 函数,您应该能够将矩阵内的数据转换为数值。

      d <- as.double(d)
      

      看看这是否有效。

      【讨论】:

      • 类(金属)返回:[1]“矩阵”“数组”
      • 对原始脚本的这种更改解决了问题:Metals
      猜你喜欢
      • 2019-10-04
      • 2018-05-23
      • 2017-10-25
      • 2023-03-28
      • 2020-06-18
      • 2018-01-27
      • 2018-01-17
      • 2021-02-14
      • 1970-01-01
      相关资源
      最近更新 更多