【发布时间】:2015-08-28 23:51:48
【问题描述】:
我正在编写一个算法来计算元素之间的距离。例如,我有一个包含 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))
}
}
【问题讨论】:
-
也许你想要
?dist -
组合由
combn函数返回。距离“矩阵”并不是真正的 R 矩阵,但 @jeremycg 似乎已经满足了您的要求。 -
@BoundedDust 我认为你是对的。我不确定将其指定为 R 问题是否正确。我正在寻找一个通用的答案。但我会用 R 编程。