Как управлять длинным однострочным текстовым файлом от начала до конца и хранить переменные в списке в R?

#r #string #text

Вопрос:

У меня есть один текстовый файл, который содержит около 1000 наборов NAME и N , как показано ниже (для простоты я выбрал только два набора).

     NAME="2 B11101001",
     N=5049, 20016, 5163, 20081, 5161, 20431, 5023, 5219, 5221,
       5225, 5223, 5227, 5003, 5105, 20623, 5107, 5109, 5111, 5113, 5121, 5007
    NAME="1 A2110111 >",
     N=12034, 2195, 2197, 2199, 2201, 2109, 2032, 20295, 2203, 2205,
       2207, 2107, 2177, 20546, 11528, 20196, 2105, 21031, 11526,
       11011, 11013, 11512, 11225, 11227, 11229, 13169, 13171,
       13173, 11231, 21128, 11233, 10502, 10500, 10498, 10496,
       10494, 11912, 11778, 10492, 11946, 10490, 10488, 11802,
       10486, 11834, 10484, 11844, 10482, 10478, 11694, 11037,
       12087, 12965, 12957, 12953, 12089, 12091, 12481, 12549,
       12941, 12483, 12101, 12103, 12933, 11800, 12927, 11810,
       12923, 12105, 12111, 12113, 12731, 12739, 20806, 12745,
       12117, 12119, 12503, 10264, 11079, 10262, 12505, 12499,
       14431, 14423, 11649, 11677, 14421, 11081, 14461
 

Мне нужно загрузить этот текстовый файл и преобразовать его в list формат, который выглядит следующим образом:

 $ NAME
[1] 2 B11101001
[2] 1 A2110111 >
$ N
[1] 5049 20016 5163 20081 ... 
[2] 12034 2195 2197 ...
 

NAME является идентификатором множества N .
N указывает на последовательный порядок узлов.

У меня есть другие наборы NAME и другие атрибуты в data.frame формате, похожем на этот:

 NAME          FARE     FREQUENCY
2 B11101001   1000     10
1 A2110111 >  2000     5  
 

Они будут объединены с загруженным текстовым файлом следующим образом:

 $ NAME
[1] 2 B11101001
[2] 1 A2110111 >
$ N
[1] 5049 20016 5163 20081 ... 
[2] 12034 2195 2197 ...
$FARE
[1] 1000
[2] 2000
$FREQUENCY
[1] 10
[2] 5
 

Я думаю, что могу объединить эти два набора данных, однако я понятия не имею, как загрузить текстовый файл, который не соответствует порядковому формату, разделенному запятыми.

В настоящее время я загрузил текстовый файл с помощью readChar функции, но не могу найти способы преобразовать его в список.

введите описание изображения здесь

Как объяснено, NAME это идентификатор для определения начала набора N . N представляет собой простой набор чисел, разделенных запятой (но его порядок должен быть сохранен). Следующая пара начнется, когда мы найдем следующую NAME . Есть какие-нибудь способы реализовать это?

Мы высоко ценим ваши предложения.

Ответ №1:

Один из способов-использовать ReadLines() функцию для ввода текста в R.
Затем определите строки, начинающиеся с «NAME=» и «N=», разделите строки на разные группы, удалите ненужные части из каждой строки и объедините в соответствующие векторы.
Дополнительную информацию см. в комментариях к сценарию.

 #read text into R
text <-readLines("Stackquestion.txt")

#find rows with Name and clean up
namerows <- grep("NAME=", text)
namelist <- gsub('",', "", trimws(gsub('NAME="', "", text[namerows])))


#find rows with N
Nrows <- grep("N=", text)

ranges <- c((namerows[-1]-1), length(text))

#Remove the line breaks on the N= rows and combine
Nlist <-sapply(1:length(Nrows), function(i){
   cleantext<-trimws(text[Nrows[i]:ranges[i]])
   cleantext <- gsub('N=', "", cleantext)
   cleaned<-paste(cleantext, collapse = "")
   cleaned
})


> namelist
[1] "2 B11101001"  "1 A2110111 >"
> Nlist
[1] "5049, 20016, 5163, 20081, 5161, 20431, 5023, 5219, 5221,5225, 5223, 5227, 5003, 5105, 20623, 5107, 5109, 5111, 5113, 5121, 5007"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
[2] "12034, 2195, 2197, 2199, 2201, 2109, 2032, 20295, 2203, 2205,2207, 2107, 2177, 20546, 11528, 20196, 2105, 21031, 11526,11011, 11013, 11512, 11225, 11227, 11229, 13169, 13171,13173, 11231, 21128, 11233, 10502, 10500, 10498, 10496,10494, 11912, 11778, 10492, 11946, 10490, 10488, 11802,10486, 11834, 10484, 11844, 10482, 10478, 11694, 11037,12087, 12965, 12957, 12953, 12089, 12091, 12481, 12549,12941, 12483, 12101, 12103, 12933, 11800, 12927, 11810,12923, 12105, 12111, 12113, 12731, 12739, 20806, 12745,12117, 12119, 12503, 10264, 11079, 10262, 12505, 12499,14431, 14423, 11649, 11677, 14421, 11081, 14461"