Чтение файла морфометрии .tps в R - PullRequest
2 голосов
/ 16 марта 2012

Я хочу прочитать файл .tps в R.

Файл примера теперь доступен по адресу:

Файл примера

Фактические файлы, которые я пытаюсь прочитать в R, очевидно, имеют гораздо больше индивидуумов / идентификаторов (> 1000)

Формат файла .tps создается TPSDIG.

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

Файл представляет собой обычный текстовый файл ANSI.

Файл содержит координаты X и Y и информацию о образце следующим образом.

Основная трудность заключается в том, что образцы различаются поколичество атрибутов (например, некоторые имеют 4, а некоторые имеют 6 наземных ориентиров 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 ]

3 голосов
/ 16 марта 2012

Мне не совсем понятно, что вы ищете в своем выводе.Я предположил стандартный фрейм данных с X, Y, ID и Scale в качестве переменных.

Попробуйте эту функцию, которую я скомбинировал, и посмотрите, дает ли она вам тип вывода, который вы ищете:1003 *

    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")
0 голосов
/ 21 июля 2015

Возможно, стоит упомянуть, что теперь существует пакет R geomorph , для которого есть функция readland.tps().

...