0

我在用

xing_points <- crossing.psp(a = x, b = x, details = TRUE) %>% as.data.frame()

spatstat包中获取数据帧中包含的段之间的所有交叉点以及x每个交叉点来自何处的详细信息。

a但是,由于我对输入和输入都使用相同的数据帧b,因此每个交叉点在结果数据帧中出现两次xing_points。因此,对我来说,selfcrossing.psp()以下列形式使用 smarter 似乎很自然:

xing_points <- selfcrossing.psp(x) %>% as.data.frame()

它解决了上述问题,但事实上缺乏details选项,因此不允许将每个交叉点跟踪回原始的相交段。

如何同时实现排除selfcrossing.psp()功能给出的重复和指示details

非常感谢。

4

3 回答 3

1

在这种情况下,我认为crossing.psp之后使用和删除重复的行是最容易的。为了查找重复的行,我使用了所有列都是数字的事实,因此可以对所有行进行排序并以这种方式查找重复的行:

library(spatstat)
set.seed(123)
x <- psp(runif(10), runif(10), runif(10), runif(10), window=owin())
xing_points <- as.data.frame(crossing.psp(A = x, B = x, details = TRUE))
xing_points <- xing_points[!duplicated(t(apply(xing_points, 1, sort))),]
于 2016-03-31T20:10:47.370 回答
1

我会将此作为功能请求。在 的未来版本中spatstat,该函数selfcrossing.psp将有一个details参数。[这需要一些新的 C 代码。] 请观看http://github.com/spatstat/spatstat/releases以获取更新。

于 2016-04-02T01:04:07.360 回答
0

感谢@ege-rubak,我想出了一个可行的解决方案。我无法评论他的回答,因为我的回答会太长,所以我决定写一个回答我自己的问题。首先,我注意到 Ege 的解决方案无法正常工作,因为由于 中的算法crossing.psp,具有相同xy坐标的相交点来自相同的一对相交线段,但顺序相反。也就是说,输出

xing_points <- as.data.frame(crossing.psp(A = x, B = x, details = TRUE))

例如,将同时包含 、iA = 10jB = 6iA = 6jB = 10从而使两行不重复。我发现的解决方案比预期的要复杂一些,但效果很好。它遵循:

library(spatstat)
library(dplyr)
set.seed(123)
xing_points <- psp(df_select$x_t, df_select$y_t, df_select$x_r, df_select$y_r, owin(), check = F) %>%
  crossing.psp(., ., details = T) %>%
  as.data.frame() %>%
  mutate(
    iAjB = iA*jB
  ) %>%
  arrange(x, y, iAjB) %>%
  group_by(iAjB) %>%
  filter(row_number() == 1) %>%
  as.data.frame()

我创建了iAjB列,然后按xy和排列iAjB,按最后一个分组,iAjB这样每个组只包含两个相同的交叉点,然后选择组中的第一个点。现在一切似乎都很好。

于 2016-04-04T17:24:10.240 回答