23

Rで使用したいStata.dtaファイルがたくさんあります。

私の問題は、変数名が「q0100」、「q0565」、「q0500」、「q0202」のようになっているため、役に立たないことです。ただし、「psu」、「妊娠数」、「世帯主」、「ウェイポイント」のようにラベル付けされています。

ラベル(「psu」、「waypoint」など)を取得して、操作しやすいように変数/列名として使用できるようにしたいと思います。

できればRで、またはStata自体を介してこれを行う方法はありますか?library(foreign)のread.dtaを知っていますが、ラベルを変数名に変換できるかどうかわかりません。

4

5 に答える 5

27

Rには、変数ラベルを処理するための組み込みの方法がありません。個人的には、これは修正すべきデメリットだと思います。Hmiscは、変数ラベルをハドリングするためのいくつかの機能を提供しますが、ラベルはそのパッケージ内の関数によってのみ認識されます。read.dtaは、ラベル情報を含む属性「var.labels」を持つdata.frameを作成します。次に、そこからデータディクショナリを作成できます。

> 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ファイルにはあま​​り興味深いラベルはありませんが、もっと意味のあるラベルにする必要があります。

于 2010-01-28T03:22:58.057 に答える
13

データのインポートには、新しい避難所パッケージGitHub )を使用することをお勧めします。

Hadley WickhamがREADME.mdファイルで言及しているように:

常にデータフレームを取得し、日時は対応するRクラスに変換され、ラベル付きベクトルは新しいラベル付きクラスとして返されます。必要に応じて、ファクターを強制したり、ラベル付きの値を欠落している値に置き換えたりすることが簡単にできます。dplyrも使用している場合は、大きなデータフレームが便利な方法で印刷されていることに気付くでしょう。

(強調鉱山)

RStudioを使用する場合、これにより、View("data.frame")ビューアペイン(ソース)の変数名の下にラベルが自動的に表示されます。

変数ラベルは、各変数の属性として付けられます。これらは印刷されませんが(長くなる傾向があるため)、RStudioのプレビューバージョンを使用している場合は、改良されたビューアペインに表示されます。

次を使用してパッケージをインストールできます。

install.packages("haven")

以下を使用してStataの日付をインポートします。

read_dta("path/to/file")

詳細については、以下を参照してください。

help("read_dta")
于 2015-11-12T13:12:08.213 に答える
3

Rまたはテキストファイルにエクスポートする前に、Stata内から変数ラベルを変数名に変換できます。
Ianが言及しているように、変数ラベルは通常、適切な変数名にはなりませんが、スペースやその他の文字をアンダースコアに変換し、変数ラベルが長すぎない場合は、変数ラベルをvarlabelsで簡単に再ラベル付けできます。

以下は、組み込みのStataデータセット「cancer.dta」を使用してすべての変数名をvarラベルに置き換える例です。重要なことに、このコードは変数ラベルのない変数の名前を変更しようとはしません。変数の命名に役立たない文字がたくさんあるデータセットも選択したことに注意してください(例:=、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

また、 StatTransferとStataをRデータファイルに変換する機能を確認することも検討してください。

于 2010-07-14T02:08:37.057 に答える
3

Stata変数ラベルを使用して必要な式を評価する関数は次のとおりです。

#' Function to prettify the output of another function using a `var.labels` attribute
#' This is particularly useful in combination with read.dta et al.
#' @param dat A data.frame with attr `var.labels` giving descriptions of variables
#' @param expr An expression to evaluate with pretty var.labels
#' @return The result of the expression, with variable names replaced with their labels
#' @examples
#' testDF <- data.frame( a=seq(10),b=runif(10),c=rnorm(10) )
#' attr(testDF,"var.labels") <- c("Identifier","Important Data","Lies, Damn Lies, Statistics")
#' prettify( testDF, quote(str(dat)) )
prettify <- function( dat, expr ) {
  labels <- attr(dat,"var.labels")
  for(i in seq(ncol(dat))) colnames(dat)[i] <- labels[i]
  attr(dat,"var.labels") <- NULL
  eval( expr )
}

その後、prettify(testDF, quote(table(...)))またはあなたが望むものは何でもできます。

詳細については、このスレッドを参照してください。

于 2013-03-10T01:41:44.280 に答える
1

避難所パッケージを使用する場合:

インポートするデータセットが重い場合、Rstudioでのデータの表示は最適ではない可能性があります。

代わりに、列名、列ラベル、および列にラベルが付けられているかどうかを示すインジケーターを含むdata.frameを取得できます。

d <- read_dta("your_stata_data.dta") 

vars <- data.frame(
                   "name" = names(d),
                   "label" = sapply(d, function(x) attr(x, "label"))  %>% as.character(),
                   "labelled" = sapply(d, is.labelled) )

注:ラベルのNULLが削除されて、ベクトルの長さが異なることを回避するには、as.charactedを使用する必要があります。

于 2019-01-21T00:05:57.807 に答える