2015-05-22 68 views
3

按行調整兩個變量的值,我有這樣一個data.frame:使用螺旋四方形的算法

 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(可以將其視爲行的座標)。

誰能想到這樣做的更好的辦法?

+0

不知道,如果你需要他們的所有是完全不同的,但你可以考慮 '抖動' 點[見本](https://stat.ethz.ch/R-manual/R-devel/library/base/html/jitter.html) – Minnow

+2

我剛一派「正方形的螺旋算法」。從預覽圖片來看,它可能是相關的? – Henrik

+0

@Henrik感謝 - 調整後的稱號,這也正是我所追求的 – jalapic

回答

1

這裏是一個簡單的循環:

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

+0

謝謝,但我不認爲這是一個有大量n的方形螺旋,從同心圓的中心向外走 - 也許我錯過了一些東西 - 例如'DF <-get_spiral(C(10,10),1,20); df < - data.frame(df); ggplot(DF,AES(X1,X2))+ geom_path()' – jalapic

+0

@jalapic好吧,我認爲這是固定的。我只是說在環路目前的「環」跟蹤另一個變量,並改變了'x'和'y'遍歷'myg',而不是'seq_along(MYG)'像以前一樣。 – Frank