colMeansx,na.rm = TRUE中的错误:“ x”必须为数字

问题描述

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

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) 
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”必须为数字

解决方法

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

将数据转换为数字,然后尝试使用scale函数:

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

该表被错误地读入,您可以看到例如在“ 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 
,

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

d <- as.double(d)

看看是否可行。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...