使用R中的n个连续行在矩阵上循环

时间:2016-10-11 14:18:16

标签: r matrix

我有一个由两列和一些(n)行组成的矩阵,而每行代表一个坐标为x和y(两列)的点。 这就是它的外观(LINK):

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

现在,我想使用从1开始的三个连续点的子集来做一些拟合,将这个值保存在另一个列表中,将密码保存到接下来的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])表示半径,这是我真正感兴趣的。我真的被困在这里,请帮忙。

非常感谢提前!

最好,大卫

1 个答案:

答案 0 :(得分: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