R 如何将点从另一组点分类为区域?
我有一组点在x-y空间中勾勒出区域,根据这些区域,我需要对第二组点进行分类(根据它们属于哪个区域)。例如,具有区域的数据帧如下所示(这些区域可以标记为a、b、c、d、e等,但我没有对应于这些区域的数据): 如本例所示,一些点位于直线上或非常靠近直线。有人知道我该如何将红点划分为哪个区域吗?我的想法是对每条线分别拟合回归,然后用它来决定点落在哪个区域,但我必须在x方向和y方向上都这样做。另外,我的一些线路是非常非线性的,所以这可能很难做到。也许有人对我如何处理这件事有另一个想法。R 如何将点从另一组点分类为区域?,r,ggplot2,R,Ggplot2,我有一组点在x-y空间中勾勒出区域,根据这些区域,我需要对第二组点进行分类(根据它们属于哪个区域)。例如,具有区域的数据帧如下所示(这些区域可以标记为a、b、c、d、e等,但我没有对应于这些区域的数据): 如本例所示,一些点位于直线上或非常靠近直线。有人知道我该如何将红点划分为哪个区域吗?我的想法是对每条线分别拟合回归,然后用它来决定点落在哪个区域,但我必须在x方向和y方向上都这样做。另外,我的一些线路是非常非线性的,所以这可能很难做到。也许有人对我如何处理这件事有另一个想法。 谢谢 这是我一直
谢谢 这是我一直在考虑的匹配两个表的方法。我看到你已经编辑了这个问题,所以这可能没有用。也许您可以使用这个示例,并发现它对您的数据很有用
DT <- data.table(na.omit(test))
q <- DT[, lapply(.SD, quantile)]
breaks_x1 = c(4.9, round(q[,x1])[2:5])
breaks_y1 = round(q[,y1])
# Convert numeric variables in factors, using quantiles as breaks
DT$fc_x1 <- cut(DT$x1, breaks = breaks_x1, labels = c("a", "b", "c", "d"), rigth = TRUE)
DT$fc_y1 <- cut(DT$y1, breaks = breaks_y1, labels = c("a", "b", "c", "d"), rigth = TRUE)
# Create label combination of both variables
DT$label <- paste0(DT$fc_x1, DT$fc_y1)
table(DT$label)
test2$fc_x2 <- cut(test2$x2, breaks = breaks_x1, labels = c("a", "b", "c", "d"), rigth = TRUE)
test2$fc_y2 <- cut(test2$y2, breaks = breaks_y1, labels = c("a", "b", "c", "d"), rigth = TRUE)
test2$label <- paste0(test2$fc_x2, test2$fc_y2)
test2
# x2 y2 fc_x2 fc_y2 label
# 1 10 8.0 a b ab
# 2 15 5.0 c a ca
# 3 7 14.0 a c ac
# 4 14 7.5 c b cb
# 5 15 12.0 c c cc
tst <- DT[,j=list(x1,
y1,
label = as.factor(label)
)]
test2 <- data.table(melt(test2)[3:5])
setkey(test2, label, value)
setkey(tst, label)
datapoly <- merge(tst, test2, by = "label")
ggplot(datapoly, aes(x=x1, y=y1)) +
geom_polygon(aes(fill=value, group=label))
DT我会将您在开始时描述的标签添加到测试data.frame
,并尝试将这两个data.frames
连接起来。就目前而言,很难提供解决方案。谢谢你,马丁。我实际上没有对应于测试数据帧的标签数据。通过标签,我实际上意味着数据框定义的区域可以被标记,但我没有数据实际表明这一点。至于连接两个数据帧,这不要求每个数据帧的列长度相等吗?您只需要在两个data.frames
中共用一列即可。它不需要同样的长度。嗨,马丁,谢谢你的帮助!然而,我不确定我是否理解你的意思。您的意思是(例如)将x1和x2列都重命名为x吗?我建议您阅读软件包sp
或软件包SDMTools
中的文档。这两种算法都实现了确定点是否位于多边形中的算法。
test2 <- structure(list(x2 = c(10L, 15L, 7L, 14L, 15L), y2 = c(8, 5, 14,
7.5, 12)), .Names = c("x2", "y2"), class = "data.frame", row.names = c(NA,
-5L))
library(ggplot2)
ggplot(test, aes(x=x1, y=y1)) +
geom_point(color="gray") +
geom_point(data=test2, aes(x=x2, y=y2), color="red")
DT <- data.table(na.omit(test))
q <- DT[, lapply(.SD, quantile)]
breaks_x1 = c(4.9, round(q[,x1])[2:5])
breaks_y1 = round(q[,y1])
# Convert numeric variables in factors, using quantiles as breaks
DT$fc_x1 <- cut(DT$x1, breaks = breaks_x1, labels = c("a", "b", "c", "d"), rigth = TRUE)
DT$fc_y1 <- cut(DT$y1, breaks = breaks_y1, labels = c("a", "b", "c", "d"), rigth = TRUE)
# Create label combination of both variables
DT$label <- paste0(DT$fc_x1, DT$fc_y1)
table(DT$label)
test2$fc_x2 <- cut(test2$x2, breaks = breaks_x1, labels = c("a", "b", "c", "d"), rigth = TRUE)
test2$fc_y2 <- cut(test2$y2, breaks = breaks_y1, labels = c("a", "b", "c", "d"), rigth = TRUE)
test2$label <- paste0(test2$fc_x2, test2$fc_y2)
test2
# x2 y2 fc_x2 fc_y2 label
# 1 10 8.0 a b ab
# 2 15 5.0 c a ca
# 3 7 14.0 a c ac
# 4 14 7.5 c b cb
# 5 15 12.0 c c cc
tst <- DT[,j=list(x1,
y1,
label = as.factor(label)
)]
test2 <- data.table(melt(test2)[3:5])
setkey(test2, label, value)
setkey(tst, label)
datapoly <- merge(tst, test2, by = "label")
ggplot(datapoly, aes(x=x1, y=y1)) +
geom_polygon(aes(fill=value, group=label))