Как подключить TXT-линию в R - PullRequest
1 голос
/ 10 марта 2020

У меня есть текстовый файл с 2940 строками, где шаблон идет каждые 10 строк (т. Е. Строки от 1 до 10 соответствуют объекту 1 ... et c).

Вот несколько примеров линии:

[1] 1254 0 40 1 1 0 0
[1] -9 2 140 0 289 -9 -9 -9
[1] 0 -9 -9 0 12 16 84 0
[1] 0 0 0 0 150 18 -9 7
[1] 172 86 200 110 140 86 0 0
[1] 0 -9 26 20 -9 -9 -9 -9
[1] -9 -9 -9 -9 -9 -9 -9 12
[1] 20 84 0 -9 -9 -9 -9 -9
[1] -9 -9 -9 -9 -9 1 1 1
[1] 1 1 -9. -9. name    # whenever you see the word "name", that's the stop of one pattern
[1] 1255 0 49 0 1 0 0
[1] -9 3 160 1 180 -9 -9 -9
[1] 0 -9 -9 0 11 16 84 0
[1] 0 0 0 0 -9 10 9 7
[1] 156 100 220 106 160 90 0 0
[1] 1 2 14 13 -9 -9 -9 -9
[1] -9 -9 -9 -9 -9 -9 -9 11
[1] 20 84 1 -9 -9 2 -9 -9
[1] -9 -9 -9 -9 -9 1 1 1
[1] 1 1 -9. -9. name           # another stop
1848 Levels: -9 -9 -9 -9 -9 -9 -9 -9 ... 99 85 170 105 160 95 1 0

Я создаю это с кодом

data = read.table(file,header = T, sep = "\n")

Когда я пытаюсь сделать al oop, который соединяет каждые 10 строк,

while (j < 2940){
    for (index in 1:294){
        new_data[index] = cbind(data1[a,],data1[b,],data1[c,],data1[d,],data1[e,],
            data1[f,],data1[g,],data1[h,],data1[i,], data1[j,])
        a = a +10
        b = b +10
        c = c +10
        d = d +10
        e = e +10
        f = f +10
        g = g +10
        h = h +10
        i =  i +10
        j = j +10
            }
}

вывод складывает число в строке. Например, строка 1 становится 1323.

По сути, я хочу реорганизовать текстовый файл в что-то вроде этого:

1254 0 40 1 1 0 0 -9 2 140 0 289 -9 -9 -9 0 -9 -9 0 12 16 84 0 0 0 0 0 150 18 -9 7 172 86 200 110 140 86 0 0 0 -9 26 20 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 12 20 84 0 -9 -9 -9 -9 -9 -9 -9 -9 -9 -9 1 1 1 1 1 -9. -9. name

это ОДНА строка с 73 столбцами и аналогичная строка после.

вот dput () в случае необходимости: https://codeshare.io/5Dy4EW

1 Ответ

0 голосов
/ 10 марта 2020

Вот потенциальное решение, использующее функцию readLines с последующим циклом через каждые 10 строк данных. Результатом использования функции separate является кадр данных с одним столбцом для всех 76 чисел / «имя».

#read file in by individual lines
file<-readLines("test.txt")

#find the rows with the end of pattern
endofpattern<-grep("name", file)

#Create vector of collapse strings
answer<-sapply(endofpattern, function(i) {
  paste(file[(i-9):(i)], collapse = " ")
})

#create data frame and divide into columns
library(tidyr)
separate(data.frame(answer), col=answer, into=paste0("C", 1:76))



    C1 C2 C3 C4 C5 C6 C7 C8 C9 C10 C11 C12 C13 C14 C15 C16 C17 C18 C19 C20 C21 C22 C23 C24 C25 C26 C27 C28 C29 C30 C31 C32 C33 C34 C35 C36 C37
1 1254  0 40  1  1  0  0  9  2 140   0 289   9   9   9   0   9   9   0  12  16  84   0   0   0   0   0 150  18   9   7 172  86 200 110 140  86
2 1255  0 49  0  1  0  0  9  3 160   1 180   9   9   9   0   9   9   0  11  16  84   0   0   0   0   0   9  10   9   7 156 100 220 106 160  90
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...