2016-10-11 9 views
0

2つの列と数(n)の行からなる行列を持ち、各行は座標xとy(2つの列)を持つ点を表します。 これは、それが(LINK)に見えるものです:Rの連続した行を使用するループオーバーマトリックス

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

今、私はデン、別のリストに、このフィットから値を保存し、いくつかのフィッティングを行うには1から3つの連続した点のサブセットを使用したいです次の3つのポイント、そして次の3つのポイントに進みます。リストが終了するまで続きます。このようなもの:

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,]) 

私はループを構築しようとしましたが、動作させることはできません。 Rは、「}」に「予期しない」があること、または「下付き文字が債券ではない」ことを教えています。これは私が試したものである:

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. 

を最小の実行可能なコードフィット円(CFKasa [3])の3番目の要素は、私が本当に興味を持って何である、半径を表します。私は本当にここにこだわっている、助けてください。

事前に感謝します。

ベスト、デビッド

+0

はどうもありがとうございました! –

+0

Zheyuan Liが述べたように、あなたは遠くまで走っているループを世話する必要があります。最初に問題を説明したように、私はDataが2次元だと仮定していますので、代わりに 'length(Data [、1])'を使いたいと思います。 2番目のことは 'length(Data [、1]) - 2'までループを実行するだけです。 –

+0

私のアプローチは、データを3次元配列にして' apply'を使うことです。再現可能な例を提供し、詳細を表示するかもしれません。 – Roland

答えて

0
は、3D配列にデータを入れ、 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。この場合、' center 'のためにした関数を定義するために' CircleFitByKasa 'を使うことを提案します。最後のステップでは 'DF'ですか? –

+0

元のdata.frame最後のステップはapplyが機能することを示しています。 – Roland

関連する問題