Это должно сделать это.Это определенно не самый чистый способ сделать это, но с точки зрения начинающих, функции довольно просты.test_table.txt
- это те же данные, которые вы указали в начале.Я не создаю никаких списков, и вывод выглядит как
> output
[,1] [,2] [,3] [,4] [,5]
XYZ = 1 1 40 3 24 4
2 40 4 16 21
3 40 3 12 16
XYZ = 2 1 40 3 24 4
2 40 4 16 21
3 40 3 12 16
XYZ = 3 1 40 5 27 8
2 40 4 16 21
3 40 2 14 24
XYZ = 4 1 40 5 27 8
2 40 4 16 21
3 40 2 14 24
data <- readLines ("test_table.txt") </p>
get_rid <- which(unlist(strsplit(data, split = "=")) == "XYZ")
new_data <- data[-c(get_rid[1], get_rid[2:length(get_rid)]-1)]
output <- matrix(nrow = 1, ncol = 5)
for ( i in 1 : length(new_data) ) {
temp <- unlist(strsplit(new_data[i], " "))
if ( temp[1] == 1 && i != 1 ) {
c <- length(output[,1])
output <- rbind(output, output[(c-output[(c-1),1]):(output[c,1]+1),])
##output <- rbind(output, output[(i-output[(i-1),1]):(output[(i),1]+1),])
output <- rbind(output, as.numeric(temp))
} else {
output <- rbind(output, as.numeric(temp))
}
if ( i == length(new_data) ) {
output <- rbind(output, output[max(which(output[,1] ==
1)):length(output[,1]),])
}
}
output <- output[2:length(output[,1]),]
xyz_names <- character(length(output[,1]))
c <- 1
for ( i in 1 : length(output[,1]) ) {
if ( output[i,1] == 1 ) {
xyz_names[i] <- paste("XYZ =", c, collapse = "")
c <- c + 1
} else {
xyz_names[i] <- ""
}
}
rownames(output) <- xyz_names
##the values of XYZ = ... is
which(output[,1] == 1)
output