将.tps形态测量学文件读入R中

时间:2012-03-15 23:01:34

标签: r text-files tps

我希望将.tps文件读入R。

现在可以在以下位置找到示例文件:

example file

我试图读入R的实际文件显然有更多个人/ ID(> 1000)

.tps文件格式由TPSDIG生成。

http://life.bio.sunysb.edu/morph/

该文件是ANSI纯文本文件。

该文件包含X和Y坐标以及样本信息,如下所示。

主要困难是标本的属性数量不同(例如,一些有4个,有些有2个LM地标,有些有2条曲线,有些没有,因此没有关联点)。

我尝试过使用for循环和read.table,但无法找到一种方法来解释不同数量的属性。

文件开始的例子

LM=3
1  1
2  2
3  3
CURVES=2
POINTS=2
1 1
2 2
POINTS=2
1 1
2 2
IMAGE=COMPLETE/FILE/PATH/IMAGE
ID=1
SCALE=1
LM=3
1  1
2  2
3  3
CURVES=2
...

如果所有样本具有相同数量的属性,则可以使用示例虚拟代码。

i<-1
landmarks<-NULL
while(i < 4321){

  print(i)

  landmarks.temp<-read.table(file="filepath", sep=" ", header=F, skip=i, nrows=12, col.names=c("X", "Y"))
  i<-i+13
  landmarks.temp$ID<-read.table(file="filepath", sep=c(" "), header=F, skip=i, nrows=1, as.is=T)[1,1]
  i<-i+1
  landmarks.temp$scale<-read.table(file="filepath", sep=c(" "), header=F, skip=i, nrows=1, as.is=T)[1,1]
  i<-i+2

  landmarks<-rbind(landmarks, landmarks.temp)

  print(unique(landmarks.temp$ID))
}

2 个答案:

答案 0 :(得分:3)

我不完全清楚你在输出中要找的是什么。我假设一个标准数据框,其中包含X,Y,ID和Scale作为变量。

尝试这个我扔在一起的功能,看看它是否为您提供了您正在寻找的输出类型:

    read.tps = function(data) {
      a = readLines(data)
      LM = grep("LM", a)
      ID.ind = grep("ID", a)  
      images = basename(gsub("(IMAGE=)(.*)", "\\2", a[ID.ind - 1]))

      skip = LM
      nrows = as.numeric(gsub("(LM=)([0-9])", "\\2", grep("LM", a, value=T)))
      l = length(LM)

      landmarks = vector("list", l)

      for (i in 1:l) {
        landmarks[i] = list(data.frame(
            read.table(file=data, header=F, skip=LM[i],
                       nrows=nrows[i], col.names=c("X", "Y")),
            IMAGE = images[i],
            ID = read.table(file=data, header=F, skip=ID.ind[i]-1, 
                            nrows=1, sep="=", col.names="ID")[2,],
            Scale = read.table(file=data, header=F, skip=ID.ind[i],
                                nrows=1, sep="=")[,2]))
      }
      do.call(rbind, landmarks)
    }

加载完该功能后,您可以输入以下命令来使用它:

read.tps("example.tps")

其中“example.tps”是工作目录中.tps文件的名称。

如果要将输出分配给新对象,可以使用标准:

landmarks <- read.tps("example.tps")

答案 1 :(得分:0)

或许值得一提的是,现在有一个R包geomorph,它有一个函数readland.tps()

相关问题