gpt4 book ai didi

r - 使用方形螺旋算法按行调整两个变量的值

转载 作者:行者123 更新时间:2023-12-04 11:59:09 27 4
gpt4 key购买 nike

我有一个像这样的数据框:

        X1       X2 n
1 -80.3845 43.19402 4
2 -80.3845 43.19402 4
3 -80.3845 43.19402 4
4 -80.3845 43.19402 4

您会注意到每个变量中的值都相同。我想要做的是创建一个经过调整的新数据框,以便变量 X1 和 X2 不重叠。我需要它们相差 0.1。最终数据框应如下所示:

        X1       X2 n
1 -80.3845 43.19402 4
2 -80.3845 43.29402 4
3 -80.2845 43.29402 4
4 -80.2845 43.19402 4

此图可能有助于表示正在发生的事情:

enter image description here

这些值代表经度和纬度,我将第一个点保留在原位,然后向上移动一个位置,然后向右移动一个位置,然后向下移动一个位置到数字 4。

这对于手动完成几行来说非常容易,但是当我们添加更多的点时,它会变得更加复杂。对于任何“n”,第一行将保持相同的值,并且这些行将以顺时针方式蜿蜒而行。因此,对于 8 行,它看起来像这样:

        X1       X2 n
1 -80.3845 43.19402 8
2 -80.3845 43.29402 8
3 -80.2845 43.29402 8
4 -80.2845 43.19402 8
5 -80.2845 43.09402 8
6 -80.3845 43.09402 8
7 -80.4845 43.09402 8
8 -80.4845 43.19402 8

'n' 的最大数量约为 400。我的想法是,我应该尝试提前计算 1-400 中的每个数字在上图的配置中的位置。即它们是......-3,-2,-1,0,1,2,3,......远离中心点的行/列。然后用它来计算X1(可以认为是列的坐标)和X2(可以认为是行的坐标)中相应的调整值。

有谁能想到更好的方法吗?

最佳答案

这是一个简单的循环:

get_spiral <- function(orig,incr,n){

ng <- ceiling(sqrt(n))
myg <- -floor((ng-1)/2):ceiling((ng-1)/2)
x0 <- which(myg==0)
y0 <- which(myg==0)

vecs <- lapply(orig,`+`,myg*incr)
res <- matrix(,n,2)

x <- 0
y <- 0
goin <- "up"
ring <- 0
for (i in 1:n){
res[i,] <- c(vecs[[1]][x0+x],vecs[[2]][y0+y])

if(goin=="up" ){y=y+1; if(y== ring+1){ring=ring+1; goin="right"}; next}
if(goin=="right"){x=x+1; if(x== ring ){ goin="down" }; next}
if(goin=="down" ){y=y-1; if(y== -ring ){ goin="left" }; next}
if(goin=="left" ){x=x-1; if(x== -ring ){ goin="up" }; next}
}
res
}

例子:

require(ggplot2)
mat<-get_spiral(c(10,10),1,22); df<-data.frame(mat); ggplot(df,aes(X1,X2))+geom_path()

Result from the example

关于r - 使用方形螺旋算法按行调整两个变量的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30402594/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com