2016-09-24 1 views
4

Hadley Wickhamのhavenパッケージは、Stataファイルに適用され、 "labeled"タイプの列が多数あるチブルを返します。R:Stataからの避難所からの "ラベル付き"チブル列からlabels属性を抽出

$ MSACMSZ :Class 'labelled' atomic [1:8491861] NA NA NA NA NA NA NA NA NA NA ... 
    .. ..- attr(*, "label")= chr "metropolitan area size (cmsa/msa)" 
    .. ..- attr(*, "labels")= Named int [1:7] 0 1 2 3 4 5 6 
    .. .. ..- attr(*, "names")= chr [1:7] "not identified or nonmetropolitan" "100,000 - 249,999" "250,000 - 499,999" "500,000 - 999,999" ... 

私は単純な要因に、これらすべてのラベルベクトルを抽出することができればそれはいいだろうが、私は、ラベルの長さを比較しているが、ユニークな値の数に属性:あなたはSTRとこれらの()、などを見ることができますそれぞれのベクトルでは、それは時には、より長く、時には短くなります。だから私はすべてを見て、それぞれを個別に扱う方法を決めなければならないと思う。

私はリストにlabels属性の値を抽出したいと思います。ただし、この関数は次のようになります。

labels93 <- lapply(cps_00093.df, function(x){attr(X, which="labels", exact=TRUE)}) 

は、すべての変数に対してNULLを返します。

これは、データフレームの問題と同じですか?どのようにこれらの属性をチブル列からリストに抽出するのですか?

ラベルベクターには名前が付けられていますが、ラベルと名前の両方が必要です。

@Hack-Rのリクエストによると、ここではdputによって変換されたような小さなデータがあります(以前は一度も使用していませんでした)。私はこのコードを適用した:

filter(cps_00093.df, YEAR==2015) %>% 
    sample_n(10) %>% 
    select(HHTENURE, HHINTYPE) -> tiny 
dput(tiny, file = "tiny") 

小さなファイルを生成する。ねえ!それは簡単でした!私はこの小さな小片を分解することは難しいと思った。メモ帳++と小さな

オープニングは、これは私が見つけたものです:

structure(list(HHTENURE = structure(c(2L, 1L, 1L, 2L, 1L, 1L, 
1L, 2L, 1L, 1L), labels = structure(c(0L, 1L, 2L, 3L, 6L, 7L), .Names = c("niu", 
"owned or being bought", "rented for cash", "occupied without payment of cash rent", 
"refused", "don't know")), class = "labelled"), HHINTYPE = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), labels = structure(1:3, .Names = c("interview", 
"type a non-interview", "type b/c non-interview")), class = "labelled")), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"), .Names = c("HHTENURE", 
"HHINTYPE")) 

私はこれは少し間隔がより読みやすく作ることができる疑いがあるが、私は偶然に関連する破壊の恐れのためにそれをマックしたくありませんでした情報。

+0

でしたあなた 'dput()問題をカプセル化し、再現例えば必要なデータの'最小量? –

+0

'?haven :: labelled'を参照してください。彼らは独自の 'as_factor'メソッドを持っています。 – alistaire

+0

チップのおかげで、@alistaire!残念ながら、各列のデータ部分のユニークな値の数とラベルベクトルの相対的な長さは、すべてマップ上にあります。ほとんどの列では、1対1の一致だけでなく、いくつかの不足しているコードでもありません。だから私は、データをより詳細に見て、何が起こっているのかを理解するまで、サイズに合わせた変換を信頼する準備ができていません。 – andrewH

答えて

2

私のコードはそれほどきれいではありませんが、私はこれに答えるつもりです。

まず、単一の列から名前付き属性を抽出する関数を作成します。

その後
ColAttr <- function(x, attrC, ifIsNull) { 
# Returns column attribute named in attrC, if present, else isNullC. 
    atr <- attr(x, attrC, exact = TRUE) 
    atr <- if (is.null(atr)) {ifIsNull} else {atr} 
    atr 
} 

すべての列にそれをlapplyする機能:

AtribLst <- function(df, attrC, isNullC){ 
# Returns list of values of the col attribute attrC, if present, else isNullC 
    lapply(df, ColAttr, attrC=attrC, ifIsNull=isNullC) 
} 

最後に、私はそれぞれの属性のためにそれを実行します。

stub93 <- AtribLst(cps_00093.df, attrC="label", isNullC=NA) 

labels93 <- AtribLst(cps_00093.df, attrC="labels", isNullC=NA) 
labels93 <- labels93[!is.na(labels93)] 

すべての列は、「ラベル」属性を持っていますが、唯一のいくつかは、「ラベル」タイプのものであるので、「ラベル」属性を持っています。 labels属性には名前が付けられます。ラベルはデータの値と一致し、名前はそれらの値の意味を示します。

1

元の質問は「ラベル属性の値をリストに抽出する方法」を尋ねます。主な質問に対する解決策は、以下の(some_df仮定はhavenを経由して輸入し、label属性があります):

library(purrr) 
n <- ncol(some_df) 
labels_list <- map(1:n, function(x) attr(some_df[[x]], "label")) 

# if a vector of character strings is preferable 
labels_vector <- map_chr(1:n, function(x) attr(some_df[[x]], "label")) 
関連する問題