#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. просто разделите длину вектора символов на количество столбцов. Это должно дать вам необходимое количество строк.