我正在编写一种算法来计算元素之间的距离。例如,我有一个3行和2列的数据集(学生A,B和C)和他们的高度。我必须对所有元素的距离进行区分并计算矩阵。所有可能的计算是A-A,A-B,A-C,B-A,B-B,B-C,C-A,C-B,C-C。但是A-B和B-A的绝对差异是相等的。
目前我使用了if条件来避免比较相似的元素(A-A,B-B)。但仍然有重复的计算。我的目标是避免重复计算。
例如,如果完成A-B,则不计算B-A,并且将A-B的值分配给正确的矩阵位置。如果有人可以就此提出建议,那会很有帮助。
更新: 场景:我有3 files(data_A,data_B和data_C)。将这些文件视为模型。每个模型都有一组属性(A,B,C,D)。不同的模型有不同的属性。例如data_A(A,B,C),data_B具有(A,D,C),data_C具有(A,B,C)。
我的目标是根据公共属性比较模型。首先,我扫描模型,找出所有模型共有的属性。在这种情况下,它只有A和C.接下来,我将根据常见属性对每个模型进行成对比较。例如,我将计算data_A中A的欧几里德距离和data_B中的A,data_A中的C和data_B中的C.首先,我将计算每对的平方差的总和,然后计算该值的平方根。对每个模型对中的所有代谢物对重复这一过程,最后平方根距离的累积值将给出模型之间的单个距离值。
如果我将data_A与data_B进行比较,我的问题就在于我的算法。我不需要进行反向计算(即data_B与data_A)。目前我只忽略使用if条件对相同数据集进行比较。以下是我的代码。它可能不是编写它的最佳方式。
setwd("E:/Assignment")
uniqueDataSets = list.files(pattern = "\\.csv$")
commonVariables = c("A","C")
#To store the distances
results = data.frame(DataSet1 = character(), DataSet2 = character(), Distance=numeric() , stringsAsFactors = F)
for(i in 1:length(uniqueDataSets)) #loading the files as reference file
{
currentDataSetName = uniqueDataSets[i]
currentDataSet = read.csv(currentDataSetName)
for(j in 1:length(uniqueDataSets)) #loading the file as comparison files
{
comparedDataSetName = uniqueDataSets[j]
comparedDataSet = read.csv(comparedDataSetName)
totalDistance = 0
tempDist = 0
if(currentDataSetName != comparedDataSetName) #Ignoring comparison if it's the same data set
{
for(k in 1:length(commonVariables)) #computing pair wise distance for each metabolite
{
var1 = currentDataSet[commonVariables[k]]
var2 = comparedDataSet[commonVariables[k]]
tempDist = sqrt(sum((var1 - var2)^2))
totalDistance = totalDistance + tempDist #cumulative value of the distance between 2 models
}
} else{
totalDistance = 0
}
results = rbind(results, data.frame(DataSet1=currentDataSetName, DataSet2 = comparedDataSetName, Distance =totalDistance))
}
}
答案 0 :(得分:2)
R内置了这个:
x <- matrix(c(1.56, 1.64, 1.75), nrow = 3)
row.names(x) <-c("a", "b", "c")
dist(x)
答案 1 :(得分:0)
使用@ jeremycg数据的其他方式:
view
不可否认,对于大型数据集来说,这些要慢一些。他们都给出了:
utils::combn(x, m=2, FUN=diff)
combn(x, m=2, FUN=`-`)