我有一个带有分类和数字属性的样本数据框。我想以一种方式比较每对样品,并将其与所有其他样品进行比较。这种比较是通过具有两个参数的函数(比较两个样本)进行的。
让我们假设 data2 是数据帧, ComputeSimilarityMeasure 是我想要应用的函数。值得一提的是,此函数将分类和数字属性分开,以便用它们执行不同的计算。
我试过这个:
nsamples=nrow(data2)
for (i in 1:nsamples) {
KX(i) <- apply( data2, 1, function(x) ComputeSimilarityMeasure(x,data2[i,]) )
#...rest of the code...
}
问题是,在 ComputeSimilarityMeasure 中,样本 x 的所有属性都是字符串,甚至是数字。因此,该功能无法正常工作。
输入样本到函数(调用前):
KEY_PROMO PROMO_TYPE KEY_STORE KEY_MKT MKT_HQ_CITY MKT_HQ_STATE
1 0 1 6 Chicago IL
输入样本到函数内部(函数内部):
KEY_PROMO PROMO_TYPE KEY_STORE KEY_MKT MKT_HQ_CITY MKT_HQ_STATE
" 1" " 0" " 1" " 6" "Chicago " "IL
此时,我已经实现了两个 for 循环来解决问题(工作正常),但是,这个解决方案在计算时间方面是不可接受的( data2 具有成千上万的样本。
有关修复 apply 功能的想法吗?还有其他你估计更好的选择吗?
答案 0 :(得分:0)
你可以使用像for loop这样的sapply
nsamples=nrow(data2)
for (i in 1:nsamples) {
KX(i) <- sapply(1:nrow(data2), function(x) ComputeSimilarityMeasure(data2[x,],data2[i,]) )
#...rest of the code...
}
如果您的数据集足够大,可以并行化此过程。我建议mclapply
而不是for