windsgone 发表于 2013-4-7 12:38 
只需一个样本与其他样本进行计算,而不是两两计算,可否实现?
一样的啊。就用dist,返回的是个dist object,可以变成matrix,从里面读出需要的那个样本和其他所有的样本的距离。
sample code:
data=read.csv(file="E:\\R1.csv",header=T,row.names=1)
mdist=as.matrix(dist(data))
mvec=mdist["504",]
说明:
R最好读.csv文件,直接.xlsx文件经常有问题,所以我把你的excel xlsx转成csv了。dist默认就是算欧式距离,算完后得到一个所有距离的矩阵,假定你需要sample 504(即你的data中第一列编号504的)和其他所有sample的距离(包括和504自己),最后vector mvec中的结果就是需要的。如果你只需要504和其他所有sample的距离,想把和504自己的距离去掉,最后用:
mvec=mdist["504",-(row.names(mdist)=="504")]
马氏距离直接用mahalanobis(data,center=,cov=), 返回是一个vector,即对于每个sample X,计算
(X-mu)' S.inv (X-mu)
mu就是center或者“均值”,S即cov或者variance-covariance matrix,S.inv是S的逆。我不知道你要用神马center和cov,所以没写。如果你想算的是对于两个sample X,Y,马氏距离为:
(X-mu)' S.inv (Y-mu)
比如X固定为某个sample,Y应该变化为其他所有sample,要得到一系列的距离,这个也很容易,只要有mu和S,自己做matrix multiplication就好了。