2

.tps ファイルを R に読み込もうとしています。

サンプル ファイルは、次の場所で入手できます。

サンプルファイル

Rに読み込もうとしている実際のファイルには、明らかにもっと多くの個人/ IDがあります(> 1000)

.tps ファイル形式は、TPSDIG によって生成されます。

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

ファイルは ANSI プレーン テキスト ファイルです。

このファイルには、次のような X 座標と Y 座標、および標本情報が含まれています。

主な問題は、標本によって属性の数が異なることです (たとえば、LM ランドマークが 4 つあるものと 6 つあるもの、カーブが 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))
}
4

2 に答える 2

3

出力で何を探しているのか正確にはわかりません。X、Y、ID、およびスケールを変数とする標準データ フレームを想定しました。

一緒に投げたこの関数を試して、探している出力のタイプが得られるかどうかを確認してください。

    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")
于 2012-03-16T17:37:43.427 に答える
0

おそらく、このための機能を持つR パッケージgeomorphがあることに言及する価値がありますreadland.tps()

于 2015-07-20T22:19:21.060 に答える