【发布时间】:2019-04-09 11:30:29
【问题描述】:
我很难用这个...所以我试图找到每组彼此接近的点,并进一步将它们分组。让我根据下面的示例数据为您解释一下:
Group X Y Z
1 110 3762 431 10
2 112 4950 880 10
3 113 5062 873 20
4 113 5225 874 30
5 113 5262 875 10
6 113 5300 874 20
structure(list(Group = c(110, 112, 113, 113, 113, 113), X = c(3762,
4950, 5062, 5225, 5262, 5300), Y = c(431, 880, 873, 874, 875,
874), Z = c(10, 10, 20, 30, 10, 20)), row.names = c(NA, -6L), class = "data.frame")
我们可以看到我们有分组列 Group, X & Y 列是我们的坐标和 Z当点被定义为“接近”(欧几里得距离
我尝试过的:
我已经使用这个函数成功地计算了点之间的欧几里得距离:
for(i in 1:nrow(test)) {
if(i > 1 && test$Group[i] == test$Group[i-1]) {
test$Distance[i] <- sqrt(((test$X[i] - test$X[i-1]) ^ 2) + ((test$Y[i] - test$Y[i-1]) ^ 2))
} else {
test$Distance[i] <- NA
}
}
这给了我这个:
Group X Y Z Distance
1 110 3762 431 10 NA
2 112 4950 880 10 NA
3 113 5062 873 20 NA
4 113 5225 874 30 163.00307
5 113 5262 875 10 37.01351
6 113 5300 874 20 38.01316
这里一切都变得复杂了,因为每个组的第一行都有 NA 等等......
我想要达到的目标:
我想找到每个组的距离不大于 100 (Distance Z 列)。所以手动完成:
Group Z Grouped
1 110 10 no
2 112 10 no
3 113 20 no
4 113 60 yes
感谢您的帮助!
【问题讨论】:
-
所以,澄清一下,您想通过在比指定阈值更接近时添加它们的“Z”分数(组内)来合并点?现在,你的结果将取决于你的分数的顺序,我想这是你想要的吗?
-
是的,这正是我所需要的(还有额外的一列表明积分已被分组)
-
嗯,这有点棘手,因为排序可能会影响结果,你有一个排序算法吗?例如。在这个例子中,如果点 5 接近点 3 会怎样?
-
好吧,在这种情况下,您可以假设行号对应于顺序(或者您可以创建新列,只是增加数字)。原始数据来自通过杆的长度(X 列)和宽度(Y 列)进行测量的机器 --> 它通过杆的长度移动
-
但是当我想到它时,你可能是对的,它让它变得更加复杂!
标签: r