#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"