2016-10-11 5 views
0

Ich habe eine Matrix, die aus zwei Spalten und einer Anzahl (n) von Zeilen besteht, während jede Zeile einen Punkt mit den Koordinaten x und y (die beiden Spalten) darstellt. Dies ist, wie es aussieht (LINK):Schleife über Matrix mit n aufeinanderfolgenden Zeilen in R

V1 V2 
146 17 
151 19 
153 24 
156 30 
158 36 
163 39 
168 42 
173 44 
... 

jetzt, ich möchte eine Teilmenge von drei aufeinander folgenden Punkten verwenden, ausgehend von 1 etwas passend zu tun, um die Werte aus diesem Sitz in einer anderen Liste speichern, eine Höhle gehe zu den nächsten 3 Punkten und den nächsten drei, bis die Liste fertig ist. Etwas wie dieses:

Data_Fit_Kasa_1 <- CircleFitByKasa(Data[1:3,]) 
Data_Fit_Kasa_2 <- CircleFitByKasa(Data[3:6,]) 
.... 
Data_Fit_Kasa_n <- CircleFitByKasa(Data[i:i+2,]) 

Ich habe versucht, eine Schleife zu konstruieren, aber ich kann es nicht arbeiten lassen. R sagt mir entweder, dass es ein "unerwartetes"} in "}" gibt oder dass der "Index aus Bindungen besteht". Dies ist, was ich versucht habe:

minimal runnable Code

install.packages("conicfit") 
library(conicfit) 

CFKasa <- NULL 
Data.Fit <- NULL 

for (i in 1:length(Data)) { 
    row <- Data[i:(i+2),] 
    CFKasa <- CircleFitByKasa(row) 
    Data.Fit[i] <- CFKasa[3] 
} 

RStudio Version 0.99.902 – © 2009-2016 RStudio, Inc.; Win10 Edu. 

Das dritte Element des angepassten Kreises (CFKasa [3]) stellt den Radius, das ist, was ich bin wirklich interessiert. Ich bin wirklich hier fest, bitte hilf mir.

Vielen Dank im Voraus!

Best, David

+0

Thank you very much! –

+0

Wie von Zheyuan Li erwähnt, müssen Sie darauf achten, dass Ihr Loop zu weit läuft. Zuerst, da du dein Problem beschrieben hast, gehe ich davon aus, dass Data zweidimensional ist, also nehme ich an, dass du stattdessen "length (Data [, 1])" haben möchtest. Zweite Sache nur die Schleife laufen bis 'Länge (Data [, 1]) - 2' –

+0

Mein Ansatz wäre, die Daten in eine dreidimensionale Array und verwenden Sie "anwenden". Geben Sie ein reproduzierbares Beispiel an und ich zeige Ihnen vielleicht die Details. – Roland

Antwort

0

Ihre Daten in ein 3D-Array ein, und verwenden apply:

DF <- read.table(text = "V1 V2 
       146 17 
       151 19 
       153 24 
       156 30 
       158 36 
       163 39", header = TRUE) 
a <- t(DF) 
dim(a) <-c(nrow(a), 3, ncol(a)/3) 
a <- aperm(a, c(2, 1, 3)) 
# , , 1 
# 
#  [,1] [,2] 
# [1,] 146 17 
# [2,] 151 19 
# [3,] 153 24 
# 
# , , 2 
# 
#  [,1] [,2] 
# [1,] 156 30 
# [2,] 158 36 
# [3,] 163 39 

center <- function(m) c(mean(m[,1]), mean(m[,2])) 

t(apply(a, 3, center)) 
#  [,1] [,2] 
#[1,] 150 20 
#[2,] 159 35 

center(DF[1:3,]) 
#[1] 150 20 
+0

Ok, Ok. Also schlagen Sie vor, 'CircleFitByKasa' zu verwenden, um eine Funktion zu definieren, die Sie in diesem Fall für 'center' gemacht haben, oder? ist 'DF' im letzten Schritt? –

+0

Die ursprüngliche data.frame Der letzte Schritt zeigt nur, dass die Anwendung funktioniert. – Roland

Verwandte Themen