Есть ли простой способ использовать скрипт .do Stata для импорта данных фиксированной ширины в R? - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть файл сценария Stata .do, который используется для импорта данных из файла TXT фиксированной ширины.Вот как выглядит файл .do:

#delimit ;

**************************************************************************
   Label           : CDS 2014 ID Map
   Rows            : 4353
   Columns         : 7
   ASCII File Date : December 11, 2017
*************************************************************************;


infix 
      CHLDID14        1 - 5         CHLDSN14        6 - 7         PCGID14         8 - 12   
      PCGSN14        13 - 14        CDSHID14       15 - 18        CHLDINST14     19 - 20   
      PCGINST14      21 - 22   
using [path]\IDMAP14.txt, clear 
;
label variable  CHLDID14     "CHILD 2013 PSID FAMILY IW (ID) NUMBER" ;           
label variable  CHLDSN14     "CHILD 2013 INDIVIDUAL SEQUENCE NUMBER" ;           
label variable  PCGID14      "PCG 2013 PSID FAMILY IW (ID) NUMBER" ;             
label variable  PCGSN14      "PCG 2013 INDIVIDUAL SEQUENCE NUMBER" ;             
label variable  CDSHID14     "CDS 2014 HOUSEHOLD INTERVIEW NUMBER" ;             
label variable  CHLDINST14   "CDS 2014 HH ROSTER CHILD SEQUENCE NUM" ;           
label variable  PCGINST14    "CDS 2014 HH ROSTER PCG SEQUENCE NUM" ;             

Существует ли быстрый способ использовать этот файл .do для автоматического импорта данных в R?Или мне нужно адаптировать сценарий вручную, используя диапазоны столбцов?

Я спрашиваю, потому что у меня есть доступ только к R (не Stata), но файл .do Stata, кажется, самый простой ярлык дляправильно импортировать данные в R.

Спасибо!

Ссылка на файлы: Текстовый файл фиксированной ширины и Скрипт Stata .do

1 Ответ

0 голосов
/ 27 февраля 2019

Вот укол, но так как у нас нет файла для проверки, вы сами для этого.Вероятно, есть много предположений, которые я сделал с этим форматом, которые необходимо проверить, а именно:

  • мы находим определения столбцов между строкой с литералом infix и литералом using
  • определение каждого столбца точно columnname from hyphen to, с пробелами (даже если один символ, это будет somename 5 - 5)
  • имя файла сразу следует за литералом using;за запятой может следовать clear или другие не запятые символы, не являющиеся частью имени файла
do2fwf <- function(txt) {

  infix <- grep("^infix\\s*", txt) 
  if (length(infix) != 1L) stop("need exactly one 'infix' line")
  using <- grep("^\\s*using\\b", txt)
  if (length(using) != 1L) stop("need exactly one 'using' line")
  if (using < infix) stop("'infix' must occur before 'using'")

  hdrtxt <- txt[ (infix+1):(using-1) ]
  # "      CHLDID14        1 - 5         CHLDSN14        6 - 7         PCGID14         8 - 12   "

  re <- gregexpr("\\S+", hdrtxt)
  m <- regmatches(hdrtxt, re)
  # [[1]]
  #  [1] "CHLDID14" "1"        "-"        "5"        "CHLDSN14" "6"        "-"        "7"        "PCGID14"  "8"       
  # [11] "-"        "12"      

  if (!all(lengths(m) %% 4 == 0))
    stop("not all variables are the right format of 'name i - j'")
  if (any(lengths(m) == 0)) {
    warning("found empty lines, confusing")
    m <- Filter(length, m)
  }

  # need to convert 4x lists into 1x lists
  m2 <- do.call("c", mapply(split, m, lapply(lengths(m), function(a) (1:a-1) %/% 4)))

  nms <- sapply(m2, `[[`, 1)

  froms <- as.integer(sapply(m2, `[[`, 2))
  tos <- as.integer(sapply(m2, `[[`, 4))
  widths <- tos - froms + 1

  filename <- gsub("^\\s*using\\s*", "", txt[using])
  # this works here, but I don't know if it is generic and rule-following
  filename <- gsub("\\s*,[^,]*$", "", filename)

  list(filename = filename, names = nms, widths = widths)
  # x <- read.fwf(filename, widths=widths, ...) # header=FALSE???
  # colnames(x) <- names
}

Если вы используете данные внизу (которые на самом деле должны быть txt <- readLines("somefile.do"), вы получите следующее:

do2fwf(txt)
# $filename
# [1] "[path]\\IDMAP14.txt"
# $names
#            0            1            2            0            1            2            0 
#   "CHLDID14"   "CHLDSN14"    "PCGID14"    "PCGSN14"   "CDSHID14" "CHLDINST14"  "PCGINST14" 
# $widths
# [1] 5 2 5 2 4 2 2

, которое вы можете использовать (согласно комментариям) по своему усмотрению. Я не знаю ни строки заголовка, ни других аргументов, которые могут вам понадобиться для read.fwf.Удачи!


Текст:

txt <- readLines(textConnection('**************************************************************************
   Label           : CDS 2014 ID Map
   Rows            : 4353
   Columns         : 7
   ASCII File Date : December 11, 2017
*************************************************************************;


infix 
      CHLDID14        1 - 5         CHLDSN14        6 - 7         PCGID14         8 - 12   
      PCGSN14        13 - 14        CDSHID14       15 - 18        CHLDINST14     19 - 20   
      PCGINST14      21 - 22   
using [path]\\IDMAP14.txt, clear 
;
label variable  CHLDID14     "CHILD 2013 PSID FAMILY IW (ID) NUMBER" ;           
label variable  CHLDSN14     "CHILD 2013 INDIVIDUAL SEQUENCE NUMBER" ;           
label variable  PCGID14      "PCG 2013 PSID FAMILY IW (ID) NUMBER" ;             
label variable  PCGSN14      "PCG 2013 INDIVIDUAL SEQUENCE NUMBER" ;             
label variable  CDSHID14     "CDS 2014 HOUSEHOLD INTERVIEW NUMBER" ;             
label variable  CHLDINST14   "CDS 2014 HH ROSTER CHILD SEQUENCE NUM" ;           
label variable  PCGINST14    "CDS 2014 HH ROSTER PCG SEQUENCE NUM" ;             '))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...