比较数据框中的每对样本

时间:2016-02-26 08:39:35

标签: r dataframe apply

我有一个带有分类和数字属性的样本数据框。我想以一种方式比较每对样品,并将其与所有其他样品进行比较。这种比较是通过具有两个参数的函数(比较两个样本)进行的。

让我们假设 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 功能的想法吗?还有其他你估计更好的选择吗?

1 个答案:

答案 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