我希望将.tps文件读入R。
现在可以在以下位置找到示例文件:
我试图读入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))
}
答案 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()
。