Использование маркировок переменной Stata в R

У меня есть набор файлов Stata .dta, которые я хотел бы использовать в R.

Моя проблема состоит в том, что имена переменной не полезны мне, поскольку они похожи на "q0100", "q0565", "q0500", и "q0202". Однако они маркированы как "psu", "количество беременных", "глава хозяйства" и "waypoint".

Я хотел бы смочь захватить маркировки ("psu", "waypoint", и т.д..) и используют их в качестве моей переменной/имен столбцов, поскольку это будет легче для меня работать с.

Существует ли способ сделать это, или предпочтительно в R, или через сам Stata? Я знаю о read.dta во (внешней) библиотеке, но не знаю, может ли это преобразовать маркировки в имена переменной.

16
задан Metrics 25 August 2013 в 16:43
поделиться

2 ответа

Целью интерфейса является определение контракта между несколькими объектами, независимо от конкретной реализации.

Поэтому его обычно используют при наличии Intrace ISomething и конкретной реализации

class Something : ISomething

Поэтому переменную Interface можно использовать при создании контракта:

ISomething myObj = new Something();
myObj.SomeFunc();

Также следует прочитать интерфейс C #

Update:

Я объясню логику использования интерфейса для переменной, а не самого класса на примере (реальной жизни):

У меня есть универсальный интерфейс репозитора:

Interface IRepository {
    void Create();
    void Update();
}

И у меня есть 2 отдельных реализации:

class RepositoryFile : interface IRepository {}
class RepositoryDB : interface IRepository {}

Каждый класс имеет совершенно различную внутреннюю реализацию.

Теперь у меня есть другой объект, регистратор, который использует уже созданный репозиторий для записи. Этот объект, не важно, как репозиторий реализован, поэтому он просто реализует:

void WriteLog(string Log, IRepository oRep);

BTW, это также может быть реализовано с помощью стандартного наследования классов. Но разница между использованием интерфейсов и наследованием классов является еще одним обсуждением.

Подробнее о различии между абстрактными классами и интерфейсами см. здесь .

-121--1244320-

Вы не создаете экземпляр интерфейса - вы создаете экземпляр того, что реализует интерфейс.

точка интерфейса заключается в том, что он гарантирует, что все, что когда-либо реализовано, обеспечит методы, объявленные в нем.

Итак, теперь, на вашем примере, вы можете иметь:

MyNiftyClass : IMyInterface
{
    public void CallSomeMethod()
    {
        //Do something nifty
    }
}

MyOddClass : IMyInterface
{
    public void CallSomeMethod()
    {
        //Do something odd
    }
}

И теперь у вас есть:

IMyInterface nifty = new MyNiftyClass()
IMyInterface odd = new MyOddClass()

Вызов метода CallSomeMethod теперь будет делать либо что-то ничтожное, либо что-то странное, и это становится особенно полезным, когда вы проходите через IMyInterface в качестве типа.

public void ThisMethodShowsHowItWorks(IMyInterface someObject)
{
    someObject.CallSomeMethod();
}

Теперь, в зависимости от того, вызываете ли вы вышеупомянутый метод с помощью nifty или нечетного класса, вы получаете различное поведение.

public void AnotherClass()
{
    IMyInterface nifty = new MyNiftyClass()
    IMyInterface odd = new MyOddClass()

    // Pass in the nifty class to do something nifty
    this.ThisMethodShowsHowItWorks(nifty);

    // Pass in the odd class to do something odd
    this.ThisMethodShowsHowItWorks(odd);

}

EDIT

Здесь рассматривается, как мне кажется, ваш предполагаемый вопрос - Зачем объявлять переменную интерфейсным типом?

То есть зачем использовать:

IMyInterface foo = new MyConcreteClass();

В пользу:

MyConcreteClass foo = new MyConcreteClass();

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

public void AMethod()
{
    // Why use this?
    IMyInterface foo = new MyConcreteClass();

    // Why not use this?
    MyConcreteClass bar = new MyConcreteClass();
}

Обычно нет технической причины, по которой интерфейс является предпочтительным. Обычно я использую интерфейс, потому что:

  • я обычно вводу зависимости, так что полиморфизм необходим
  • Используя интерфейс четко указывает мое намерение использовать только члены интерфейса

Одно место, где вы технически необходимо интерфейс, это где вы используете полиморфизм, например, создание вашей переменной с помощью фабрики или (как я сказал выше) с помощью зависимости инъекции.

Заимствование примера из itowlson, используя конкретное объявление, вы не могли сделать это:

public void AMethod(string input)
{               
    IMyInterface foo;

    if (input == "nifty")
    {
        foo = new MyNiftyClass();
    }
    else
    {
        foo = new MyOddClass();
    }
    foo.CallSomeMethod();
}
-121--1244313-

R не имеет встроенного пути для обработки меток переменных. Лично я думаю, что это недостаток, который надо исправить. Hmisc действительно предоставляет некоторое средство для обработки переменных меток, но метки распознаются только функциями в этом пакете. читать.dta создает data.frame с атрибутом «var.labels», который содержит информацию о маркировке. Затем можно создать словарь данных.

> data(swiss)
> write.dta(swiss,swissfile <- tempfile())
> a <- read.dta(swissfile)
> 
> var.labels <- attr(a,"var.labels")
> 
> data.key <- data.frame(var.name=names(a),var.labels)
> data.key
          var.name       var.labels
1        Fertility        Fertility
2      Agriculture      Agriculture
3      Examination      Examination
4        Education        Education
5         Catholic         Catholic
6 Infant_Mortality Infant.Mortality

Конечно, этот файл .dta имеет не очень интересные метки, но ваш должен быть более значимым.

23
ответ дан 30 November 2019 в 16:49
поделиться

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

Ниже приведен пример использования встроенного набора данных Stata «Cance.dta» для замены всех имен переменных на метки переменных - что важно, этот код не будет пытаться переименовать переменную без меток переменных. Обратите внимание, что я также выбрал набор данных, в котором есть много символов, которые не используются при именовании переменной (например: =, 1, ',., () И т. Д.) ... вы можете добавлять любые символы, которые могут скрываться в метках переменных в список в 5-й строке: "local chars" ... "", и он внесет изменения за вас:

****************! BEGIN EXAMPLE
//copy and paste this code into a Stata do-file and click "do"//
sysuse  cancer, clear
desc
**
local chars "" " "(" ")" "." "1" "=" `"'"' "___" "__" "
ds, not(varlab "")    // <-- This will only select those vars with varlabs //
foreach v in `r(varlist)' {
    local `v'l "`:var lab `v''"
    **variables names cannot have spaces or other symbols, so::
        foreach s in `chars' {
    local `v'l: subinstr local `v'l "`s'" "_", all
              }
    rename `v' ``v'l'
    **make the variable names all lower case**
    cap rename ``v'l' `=lower("``v'l'")'
      }
desc
****************! END EXAMPLE

Вы также можете рассмотреть возможность просмотра Stat Transfer и это возможности преобразования Stata в файлы данных R.

3
ответ дан 30 November 2019 в 16:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: