问题描述
我正在尝试进行聚类分析,这需要我对数据进行缩放/标准化。数据在一个矩阵中并且是数字,但是我只收到以下消息:
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)
看看是否可行。