Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何将点从另一组点分类为区域?_R_Ggplot2 - Fatal编程技术网

R 如何将点从另一组点分类为区域?

R 如何将点从另一组点分类为区域?,r,ggplot2,R,Ggplot2,我有一组点在x-y空间中勾勒出区域,根据这些区域,我需要对第二组点进行分类(根据它们属于哪个区域)。例如,具有区域的数据帧如下所示(这些区域可以标记为a、b、c、d、e等,但我没有对应于这些区域的数据): 如本例所示,一些点位于直线上或非常靠近直线。有人知道我该如何将红点划分为哪个区域吗?我的想法是对每条线分别拟合回归,然后用它来决定点落在哪个区域,但我必须在x方向和y方向上都这样做。另外,我的一些线路是非常非线性的,所以这可能很难做到。也许有人对我如何处理这件事有另一个想法。 谢谢 这是我一直

我有一组点在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))