Как использовать fread или read_delim в R для символов без разрыва строки

#r #fread #readr

#r #fread #readr

Вопрос:

У меня есть несколько файлов .txt, которые необходимо импортировать в R в качестве фреймов данных для некоторого анализа данных. Один из этих файлов не имеет EOL ни в какой форме, поэтому мне остается только гадать, как бы я это импортировал.

 "A";"B";"C";"D";"D";"E";"F";"G";"H";"I";"J";"K";"L";"M";"N";"O";"P";"Q";"R";"S";"T";"U";"V""1";4;"55-555-5555-555";1234-56-78;"111";1510;5;1234-12-17;12345.1234512345;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA"2";6;"22-222-2222-222";5678-56-78;"222";2051;0;NA;0;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA
  

Вот как выглядят первые ~ 500 символов этого txt-файла. EOL нужно было бы разместить следующим образом:

 "A";"B";"C";"D";"D";"E";"F";"G";"H";"I";"J";"K";"L";"M";"N";"O";"P";"Q";"R";"S";"T";"U";"V"

"1";4;"55-555-5555-555";1234-56-78;"111";1510;5;1234-12-17;12345.1234512345;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA

"2";6;"22-222-2222-222";5678-56-78;"222";2051;0;NA;0;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA
  

Обычно я бы просто вставил » n» в те места, где мне это нужно, но в тех местах, где я бы поместил n, нет повторяющейся строки, поэтому я не думаю, что gsub сработал бы в этом случае.

Поскольку отсутствующие значения четко обозначены с помощью NA, существует ли функция, подобная read_delim, которая имеет аргумент «col_number = x»? Например, первые значения x — это заголовки, следующие значения x — это значения первой строки и так далее, и тому подобное?

Если это что-то изменит, эти файлы .txt довольно большие (> 300 мб).

Большое спасибо Julian_Hn. Работает как шарм.

Комментарии:

1. Фиксировано ли количество столбцов в каждой строке? Вы знаете этот номер?

2. Да и да. Но я не знаю количество строк.

3. смотрите ответ Julian_Hn, укажите количество столбцов в ncol и опустите nrow

Ответ №1:

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

 str <- ""A";"B";"C";"D";"D";"E";"F";"G";"H";"I";"J";"K";"L";"M";"N";"O";"P";"Q";"R";"S";"T";"U";"V";"1";4;"55-555-5555-555";1234-56-78;"111";1510;5;1234-12-17;12345.1234512345;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;"2";6;"22-222-2222-222";5678-56-78;"222";2051;0;NA;0;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA;NA"

vec <- strsplit(str,";")[[1]]
//EDIT: add byrow = T To stay in the right format. Thanks Yuriy
table <- matrix(vec,ncol=23,nrow=3, byrow = T)
df <- as.data.frame(table)
  

Комментарии:

1. Хороший ответ. Я думаю, что добавление byrow = TRUE в table <- matrix(vec,ncol=23,nrow=3, byrow = TRUE) может приблизить необходимый вывод.

2. Спасибо, это хорошее начало. Просто нужно выяснить, сколько там строк. // РЕДАКТИРОВАТЬ: На самом деле выяснить, сколько там строк, не должно быть слишком сложно. Я мог бы просто посчитать «;», а затем разделить это на количество столбцов.

3. просто разделите длину вектора символов на количество столбцов. Это должно дать вам необходимое количество строк.