【发布时间】:2019-04-24 02:15:10
【问题描述】:
我正在处理以下几个这样的观察结果。我的目标是根据欧几里得距离概念识别彼此匹配/相似的行,考虑向量{x1,x2,x3,x4} 和阈值0.2。小于 0.2 的行之间的任何距离都被认为是相似的。
Observation Blood x1 x2 x3 x4
1 A 0.01 0.16 0.31 0.46
2 A 0.02 0.17 0.32 0.47
3 A 0.03 0.18 0.33 0.48
4 B 0.05 0.20 0.35 0.49
5 B 0.06 0.21 0.36 0.50
6 B 0.07 0.22 0.37 0.51
7 AB 0.09 0.24 0.39 0.52
8 AB 0.1 0.25 0.4 0.53
9 AB 0.11 0.26 0.41 0.54
10 O 0.13 0.28 0.43 0.55
11 O 0.14 0.29 0.44 0.56
12 O 0.15 0.3 0.45 0.57
我可以使用非常笨重的双 forloop 来做到这一点。我想知道是否有一种有效的方法可以做到这一点。
预期输出
Observation Blood x1 x2 x3 x4 Match
1 A 0.01 0.16 0.31 0.46 Yes
2 A 0.02 0.17 0.32 0.47 Yes
3 A 0.03 0.18 0.33 0.48 No
4 B 0.05 0.20 0.35 0.49 Yes
5 B 0.06 0.21 0.36 0.50 Yes
6 B 0.07 0.22 0.37 0.51 No
7 AB 0.09 0.24 0.39 0.52 No
8 AB 0.1 0.25 0.4 0.53 Yes
9 AB 0.11 0.26 0.41 0.54 No
10 O 0.13 0.28 0.43 0.55 No
11 O 0.14 0.29 0.44 0.56 Yes
12 O 0.15 0.3 0.45 0.57 Yes
Match Dataset
RowToBeMatched FoundMatches_Bgroup_B FoundMatches_Bgroup_AB FoundMatches_Bgroup_O
1 4 8 11
2 5 NA 12
等等……
【问题讨论】:
-
所以
Match列只是告诉您整个数据框中是否存在匹配项?您不在乎哪一行匹配,只想知道是否匹配?对于这个问题,Blood列无关紧要吗? (或者你只寻找相同血型的匹配项?) -
这看起来有点像聚类(
hclust,无论如何),如果特定Blood组内的观察结果与该组的其余部分足够接近,则它们匹配。跨度> -
人们通常在第一个实例中使用
kmeans集群,它包含在 Base R 的stats包中。dbscan包也很出色,但它是非参数的,所以可能不是正是你想要的。 -
你看过fuzzyjoin包吗?
-
请编辑您的问题以详细说明这一点,因为这听起来像是在问题的当前措辞中不清楚(或根本不存在?)的重要要求。
标签: r match euclidean-distance