Stata: корректно импортировать массивный текстовый файл с разделителями (из R) с многострочным содержимым и номерами строк

#r #csv #text #import #stata

#r #csv #текст #импорт #stata

Вопрос:

Мне не удается импортировать набор данных, который я экспортировал из R в Stata 14.1. Он содержит комментарии, которые пользователи писали друг другу. Он имеет следующую структуру:

     "project_id" "project_title" "project_owner_user_id" "comment_user_user_id" "comment_date" "comment_censored" "censored_reason" "comment_content"
"1" 36 "Vending Machine" "u1" "u1" "2011-06-24 04:03:57" 0 "" "SNOTty vending machine I built for a display model."
"2" 36 "Vending Machine" "u1" "u1" "2011-07-06 01:41:30" 0 "" " Can't wait to share it!  Some technical difficulties finding/getting to the image online.  Stay tuned."
"3" 41 "Animated Stock Car" "u2" "u2" "2011-07-12 00:25:40" 0 "" "Stockcars were an American invention, introduced in the mid 1800s as a way to transport livestock of various kinds. Thousands were used in great blocks by various western railroads to collect cattle from railheads in frontier towns such as Amarillo and Dodge City, and transport them to the great meat packing cities of Chicago and Kansas City, where the slaughterhouses awaited. 

They were also used for horse transport, as this one is."
"4" 40 "Pacific Electric Hollywood Car Trolley" "u3" "u2" "2011-07-12 00:51:29" 0 "" "What kind of trucks did you have in mind for this? My streetcar model uses standard 9V trucks"
"5" 43 "WeCan - 6 times expansion of WeDo -" "u4" "u4" "2011-07-12 23:59:47" 0 "" "Expansion of present WeDo, it is WeCan.
we can use 12 ports of interaction ports."
"6" 44 "WeMust - pneumatic step from WeDo -" "u4" "u4" "2011-07-13 00:07:09" 0 "" "Automatic pneumatic cylinder controller using USB port."
 

По какой-то причине Stata не может определить правильное количество переменных (в первой строке) и добавляет дополнительные переменные:
введите описание изображения здесь

Кроме того, все содержимое переменных смещено вправо, поскольку Stata не распознает номера строк в начале строк. Если я вручную отредактирую текстовый файл и добавлю дополнительную переменную «line_number» в первой строке файла, эта проблема будет решена.

Что еще хуже, файл содержит 652569 наблюдений и содержит записи на нескольких языках, включая китайский и т.д.

Файл имеет кодировку UTF-8. Как я могу правильно импортировать этот файл в Stata?

В отличие от этого, он отлично справляется и правильно импортирует его с помощью простого oneliner:

 X <- read.table ("x.txt")
 

Однако мой сотрудник хочет использовать Stata. Спасибо за вашу помощь!

PS: Ссылка на текстовый файл для воспроизведения: http://www25.zippyshare.com/v/UKOExjU3/file.html

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

1. Как показывает ваш вопрос, Stata предназначена для обработки " " в качестве разделителей строк и, таким образом, для разделения записи соответственно на разные переменные. Если вы хотите переопределить это, вам нужны разные разделители или настаивать на том, чтобы все считывалось как одна strL переменная.

2. Как настаивать на том, чтобы все считывалось как одна переменная strL? К сожалению, я не очень хорошо разбираюсь в Stata. Спасибо! Почему он распределяет «this one is» в переменных thee? Внутри только обычные пробелы.

3. Трудно сказать без воспроизводимого примера. Иногда символы, отличные от пробелов, имеют побочные эффекты.

4. Пожалуйста, покажите, как вы экспортируете данные из R, в частности write.table() command.

5. @NickCox хм, я привел воспроизводимый пример?

Ответ №1:

Рассмотрите возможность использования команды insheet Stata, указав разделитель пробелов. Обратите внимание: это закодированное решение для использования в файле .do или окне командной строки, а не через меню графического интерфейса Stata на вашем скриншоте:

 clear
insheet using "path/to/data.txt", delimiter(" ")
 

Начальный вывод

Ниже используется ваш связанный файл, и вы заметите, что выводится неназванный столбец v9. И в наборе данных все смещено вправо. Причина в том, что в R вы экспортируете row.names, у которых нет заголовков столбцов, и поэтому Stata считывает во всех именованных / неназванных столбцах. Итак, идентификатор проекта Stata выравнивается по строке R.имена (1,2,3,4,5), заголовок проекта Stata для идентификатора проекта R и так далее.

 Contains data
  obs:             6                          
 vars:             9                          
 size:         1,878 (99.9% of memory free)
-----------------------------------------------------------------------------
              storage  display     value
variable name   type   format      label      variable label
-----------------------------------------------------------------------------
project_id      byte   %8.0g                  
project_title   byte   %8.0g                  
project_owner~d str38  %38s                   
comment_user_~d str2   %9s                    
comment_date    str2   %9s                    
comment_censo~d str19  s                   
censored_reason byte   %8.0g                  
comment_content byte   %8.0g                  
v9              str244 %244s                  
-----------------------------------------------------------------------------
Sorted by:  
     Note:  dataset has changed since last saved
 

Разрешение

Чтобы устранить вышеуказанное смещение столбцов, для вывода текста в R не выводите row.names:

 write.table(X, file = ("data.txt"), row.names = FALSE)
 

И если вы хотите сохранить идентификатор, добавьте его как новый именованный столбец для включения в экспорт:

 X$ID <- row.names(X)
 

Еще лучше использовать согласованный разделитель, такой как запятая или табуляция, используя аргумент sep . В R команда write.csv(...) на самом деле является удобной оболочкой для write.table(..., sep = ",") :

 write.csv(X, file = ("data.txt"), row.names = FALSE)

write.table(X, file = ("data.txt"), row.names = FALSE, sep="t")
 

Затем в Stata укажите с insheet параметрами, равными запятой или табуляции:

 insheet using "/path/to/data.txt", comma

insheet using "/path/to/data.txt", tab
 

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

1. Спасибо, ваш код отлично подходит для предоставленного мной примера. Я также возился с экспортом, пропуская row.names, но не запустил его. Теперь я попытался запустить код для полного набора данных, содержащего 652569 наблюдений, но я получаю только 383650: imgur.com/a/EiilF Если я введу описание, stata будет иметь следующий вывод: Contains data obs: 383,650 vars: 9 size: 1,675,399,550

2. ` project_id str1745 45s project_title str293 )3s project_owner ~d str32 2s comment_user_~d str32 2s comment_date str19 s comment_censo~ d байт %8.0g censored_reason str196 6s comment_content str2045 45s длинные имена строк .0g Имена строк ` Есть идеи, почему это может произойти? К сожалению, я не могу предоставить полный набор данных.

3. интересно import delimited "X_withRownames.txt", delimiter(tab) bindquote(strict) varnames(1) stripquote(yes) case(preserve) encoding(UTF-8) , что теперь тоже работает, и в итоге у меня есть переменные с 383 714 наблюдениями

4. должен ли я задать новый вопрос о stackoverflow сейчас для этого?

5. Хотя все записи не импортируются, правильно ли выровнены столбцы с указанием правильного разделителя? Если это так, возможно, проблема связана с ограничениями памяти, поскольку у вас есть большое текстовое поле среди других полей для 650 000 записей, довольно большой файл. Попробуйте настроить память перед импортом.

Ответ №2:

Использование Stata 14.2 (14.1 должно быть таким же)…

     import delimited <yourfile>, delimiter(space, collapse) bindquote(strict) colrange(2) encoding(UTF-8) clear

    describe

Contains data
  obs:             6                          
 vars:             8                          
 size:         3,012                          
---------------------------------------------------------------------------------
              storage   display    value
variable name   type    format     label      variable label
---------------------------------------------------------------------------------
project_id      byte    %8.0g                 
project_title   str38   %38s                  
project_owner~d str2    %9s                   
comment_user_~d str2    %9s                   
comment_date    str19   s                  
comment_censo~d byte    %8.0g                 
censored_reason byte    %8.0g                 
comment_content str438  %438s                 
---------------------------------------------------------------------------------
Sorted by: 
     Note: Dataset has changed since last saved.
 

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

1. Спасибо, но там не должно быть v9 и v1.

2. Я отредактировал свой ответ, чтобы использовать colrange(), чтобы исключить первую строку. Кроме того, исходный вывод описания не должен был содержать v9. В спешке я, должно быть, скопировал неправильный вывод. Надеюсь, это поможет.

3. Хм, это приводит к сбою: There are more columns than allowed by this Stata. See help maxvar for more information r(900); для моего большого текстового файла, для небольшой выборки, при условии, что я получу переменную v8 ?

4. Мое решение было основано на том, что вы изначально опубликовали в разделе исходного кода. Я скопировал и вставил это в текстовый файл, и результаты показаны. Разница между тем, что вы вставили, и тем, что доступно при загрузке, заключается в первой строке, где она содержит «project_id». Начальные пробелы являются разделителем, который соответствует пронумерованным столбцам, которые вы хотите опустить. Без начальных пробелов столбцы смещены. Начальные пробелы имеют тот же эффект, что и переменная, закодированная в вашем текстовом файле для количества строк. Диалоговое окно может помочь показать это перед импортом…

5. … Что касается r (900), я могу только предполагать, но, вероятно, в вашем текстовом файле что-то искажено. Вы можете попробовать импортировать диапазон строк за раз, чтобы посмотреть, сможете ли вы понять, в чем проблема.