Как реплицировать строки таблицы с определенным строковым шаблоном прямо над таблицей - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть таблица в файле.Перед началом таблицы есть строка символов.Таблица в файле выглядит следующим образом

XYZ = 11 40 3 24 42 40 4 16 213 40 3 12 16XYZ = 21 40 5 27 82 40 4 16 213 40 2 14 24

Я хочу получить вывод с репликацией всех строк.Например, строки с 1 по 3 должны повторяться, и итоговая таблица должна иметь всего 6 строк.Вывод должен выглядеть примерно так -

XYZ = 11 40 3 24 42 40 4 16 213 40 3 12 164 40 3 24 45 40 4 16 216 40 3 12 16XYZ = 21 40 5 27 82 40 4 16 213 40 2 14 244 40 5 27 85 40 4 16 216 40 2 14 24

Я новичок в R. Хорошо, если кто-нибудь поможет мне с этой проблемой.

1 Ответ

0 голосов
/ 10 февраля 2019

Это должно сделать это.Это определенно не самый чистый способ сделать это, но с точки зрения начинающих, функции довольно просты.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
...