【问题标题】:Efficient Way To Find Neighboring Coordinates In R在 R 中查找相邻坐标的有效方法
【发布时间】:2017-12-18 14:46:54
【问题描述】:

我正在使用具有 X-Y 坐标的矩阵数据集,其余列具有包含不同参数的逻辑值。给定至少一个相应的参数为真,我想找到 X-Y 的相邻坐标,然后将其作为行附加到新矩阵。以下是样本矩阵数据。

Data_1

  X  Y  P1 P2 P3 P4
-52  32  1  0  0  1
-50  34  0  0  0  0
-50  26  0  0  0  1
-52  31  0  1  1  1

为了解决这个问题,我打算使用以下算法:

算法

# Find row wise sum
newCol <- rowSums(Data_1)

# Bind as first column with Data_1
newData <- cbind(newCol, Data_1)

# Not R code, pseduo code
if (newData[,1] != 0{
    store newData[,2] and newData[,3].
    Data_2 <- find neighboring coordinates to newData[,2] and newData[,3].
}

finalData <- cbind(Data_1, Data_2)

输出

  X  Y  P1 P2 P3 P4 N1.x N1.y N2.x N2.y N3.x N3.y N4.x N4.y N5.x N5.y N6.x N6.y N7.x N7.y N8.x N8.y
-52  32  1  0  0  1      <Neighboring Coordinates---->
-50  34  0  0  0  0      <NULL>
-50  26  0  0  0  1      <Neighboring Coordinates---->  
-52  31  0  1  1  1      <Neighboring Coordinates----> 

当矩阵有数百万行和列时,这种方法的问题是可伸缩性。

下图显示了(x,y) 的相邻坐标。

如果可能,请提出更好的方法,谢谢。

【问题讨论】:

  • 对于您的示例数据,N1.x、N1.y、N2.x、N2.y、...列中的内容是什么?
  • newCol &lt;- t(t(newCol)) 这会将您的矩阵从原始矩阵转换为垂直转置,然后以与此步骤之前完全相同的格式再次转换为原始矩阵....
  • @EricWatt - 对于具有-52, 32N1.x, N1.y, N2.x, N2.y.... 的第一行,将是所有 8 个相邻坐标。其他行也是如此。
  • @sconfluentus - 谢谢。我想如果dim(newCol)NULL,那么我需要将其设为列,然后使用cbind() 追加,但正如您所指出的那样,我确实使用另一个t() 将其变为原始形式。修复了伪代码。
  • 我不知道“所有 8 个邻居坐标”是什么意思。您能显示前 4 行的预期输出吗?

标签: r algorithm matrix optimization


【解决方案1】:

数据框方法怎么样——它需要是一个矩阵吗?

# Create one data frame with the starting points
points <- data.frame(x = c(-52, -50, -50, -52), 
                     y = c( 32,  34,  26,  31))

# Create a second data frame with the desired combinations of distances
distances <- expand.grid(xd = 1:4, 
                         yd = 1:4)

# Repeat the distances for each point (cartesian product/outer join)
neighbors <- merge(points, distances) 

# Compute neighbor coordinates
neighbors$nx <- neighbors$x + neighbors$xd
neighbors$ny <- neighbors$y + neighbors$yd

# sort
neighbors <- neighbors[order(neighbors$x, neighbors$y), ]

# display
head(neighbors)

结果

     x  y xd yd  nx ny
4  -52 31  1  1 -51 32
8  -52 31  2  1 -50 32
12 -52 31  3  1 -49 32
16 -52 31  4  1 -48 32
20 -52 31  1  2 -51 33
24 -52 31  2  2 -50 33

【讨论】:

  • .@Damian - 谢谢。我从文件中获取数据并将其视为matrix,到目前为止还没有与data.frame 合作太多。另外,为什么在您的输出中x-y 有多个具有相同坐标的邻居?
  • 上一篇文章有​​重复值,因为 x-y 点被expand.grid 重复了。在这个版本中,我在单独的数据框中创建了 x 和 y
  • .@Damian - 您的建议是有道理的,但它会计算 x-y1-4 的所有组合的距离?
  • 正确。这是为了演示一般过程。 (1)构造一个数据框,每个点到邻居(或邻居距离)组合有一行,(2)计算每行上一对点的邻居的位置。可以使用任何距离。
  • .@Damian - 有one solution,但在Java。我想知道对于更大的数据集,apply() 可能有一种方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 2018-06-27
  • 2014-12-17
  • 1970-01-01
相关资源
最近更新 更多