我有一个XY点数据集,看起来像这样
x<-c(2,4,6,3,7,9,1)
y<-c(6,4,8,2,9,6,1)
id<-c("a","b","c","d","e","f","g")
dataset<-data.frame(cbind(x,y,id))
我想将所有点的所有组合与空间线连接起来,用他们所连接的点组合命名的行
在&#34;属性表&#34;由输出产生的结果,空间线的名称可能如下所示:
a_b
a_c
a_d
a_e
a_f
a_g
b_a
b_c
b_d
b_e
b_f
b_g
c_a
etc.
答案 0 :(得分:3)
我在这里猜测你究竟想要什么,但我认为你想要想象从任何一点到其他点的连接。如果是这种情况,那么这可能会奏效。 但首先是一些假设:
x
和y
坐标是起点。因此,id
因此id.origin
x_destination
,依此类推。&LT;声明&GT; 应该更好,更优雅的方式来做到这一点。如果有经验的人可以参加并向我展示任何*ply
方法,我会很感激。 &LT; /声明&GT;
复制数据框以涵盖所有可能的组合
dataset<-do.call(rbind, replicate(7, dataset, simplify=FALSE))
现在,创建一个包含所有相同目标点的矩阵,混合:
nm=matrix(ncol=3)
for (i in 1:7){
nm<-rbind(nm,do.call(rbind,replicate(7,as.matrix(dataset[i,]),simplify=FALSE)))
}
nm<-nm[-1,]
重命名矩阵的列,使它们有意义,并将现有数据框与新矩阵
绑定colnames(nm)<-c("x2","y2","id.dest")
newds<-cbind(dataset,as.data.frame(nm))
删除重复的轨迹:
newds<-newds[-which(newds$id.origin==newds$id.dest),]
并使用geom_segment
绘制结果:
p<-ggplot(newds,aes(x=x,y=y))+geom_segment(aes(xend=x2,yend=y2))
有一种方法可以命名这些片段,但是从观察情节我不建议这样做。相反,您可以考虑使用geom_text
命名这些点(其他选项可用,请参阅?annotate
)。
p<-p + geom_text(aes(x=1.8,y=6.1,label="a"))
这将产生一个像这里的情节:
答案 1 :(得分:2)
整个解决方案如下:
plot(dataset$x,dataset$y)
复制数据框以涵盖所有可能的组合
dataset<-do.call(rbind, replicate(7, dataset, simplify=FALSE))
现在,创建一个包含所有相同目标点的矩阵,混合:
nm=matrix(ncol=3)
for (i in 1:7){
nm<-rbind(nm,do.call(rbind,replicate(7,as.matrix(dataset[i,]),simplify=FALSE)))
}
nm<-nm[-1,]
重命名矩阵的列,使它们有意义,并将现有数据框与新矩阵
绑定colnames(nm)<-c("x2","y2","id.dest")
newds<-cbind(dataset,as.data.frame(nm))
删除重复的轨迹:
newds1<-newds[-which(newds$id==newds$id.dest),]
library(ggplot2)
转换目的地x&amp; y来自因子
的数字newds1$x2<-as.numeric(as.character(newds1$x2)) #converting from factor to numeric
newds1$y2<-as.numeric(as.character(newds1$y2))
绘制目的地点。 。 .same作为原点
plot(newds1$x, newds1$y)
plot(newds1$x2, newds1$y2, col="red")
现在使用此答案中的代码:
<强> Convert Begin and End Coordinates into Spatial Lines in R 强>
存储Lines对象的原始列表:
l <- vector("list", nrow(newds1)) #
此l
现在是一个空向量w /行数由newds1的长度(nrow)定义
拆分原点和目的地坐标,以便我可以运行此脚本:
origins<-data.frame(cbind(newds1$x, newds1$y))
destinations<-data.frame(cbind(newds1$x2, newds1$y2))
library(sp)
for (i in seq_along(l)) {
l[[i]] <- Lines(list(Line(rbind(origins[i, ], destinations[i,]))), as.character(i))
}
l.spatial<-SpatialLines(l)
plot(l.spatial, add=T)