У меня есть набор файлов Stata .dta, которые я хотел бы использовать в R.
Моя проблема состоит в том, что имена переменной не полезны мне, поскольку они похожи на "q0100", "q0565", "q0500", и "q0202". Однако они маркированы как "psu", "количество беременных", "глава хозяйства" и "waypoint".
Я хотел бы смочь захватить маркировки ("psu", "waypoint", и т.д..) и используют их в качестве моей переменной/имен столбцов, поскольку это будет легче для меня работать с.
Существует ли способ сделать это, или предпочтительно в R, или через сам Stata? Я знаю о read.dta во (внешней) библиотеке, но не знаю, может ли это преобразовать маркировки в имена переменной.
Целью интерфейса является определение контракта между несколькими объектами, независимо от конкретной реализации.
Поэтому его обычно используют при наличии 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 имеет не очень интересные метки, но ваш должен быть более значимым.
Вы можете преобразовать метки переменных в имена переменных из 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.