35

data.frame 列の変数ラベルに苦労しています。次のデータ フレーム (はるかに大きなデータ フレームの一部) があるとします。

data <- data.frame(age = c(21, 30, 25, 41, 29, 33), sex = factor(c(1, 2, 1, 2, 1, 2), labels = c("Female", "Male")))
#

このデータ フレームの変数ラベルを持つ名前付きベクトルもあります。

var.labels <- c(age = "Age in Years", sex = "Sex of the participant")

パッケージの関数を使用して、変数ラベルをvar.labelsデータ フレームの列に割り当てたいと考えています。このように 1 つずつ実行し、後で結果を確認できます。datalabelHmisc

> label(data[["age"]]) <- "Age in years"
> label(data[["sex"]]) <- "Sex of the participant"
> label(data)
                 age                      sex
      "Age in years" "Sex of the participant"

変数ラベルは、列の属性として割り当てられます。

> attr(data[["age"]], "label")
[1] "Age in years"
> attr(data[["sex"]], "label")
[1] "Sex of the participant"

素晴らしい。ただし、たとえば 100 列以上の大きなデータ フレームでは、これは便利でも効率的でもありません。別のオプションは、それらを属性として直接割り当てることです。

> attr(data, "variable.labels") <- var.labels

助けにならない。変数ラベルは列に割り当てられません。

> label(data)
age sex
 ""  ""

代わりに、データ フレーム自体の属性として割り当てられます (リストの最後のコンポーネントを参照)。

> attributes(data)
$names
[1] "age" "sex"

$row.names
[1] 1 2 3 4 5 6

$class
[1] "data.frame"

$variable.labels
                 age                      sex
      "Age in Years" "Sex of the participant"

そして、これは私が望むものではありません。列の属性として変数ラベルが必要です。次の関数(および他の多くの関数)を作成しようとしました:

set.var.labels <- function(dataframe, label.vector){
  column.names <- names(dataframe)
  dataframe <- mapply(label, column.names, label.vector)
  return(dataframe)
}

そしてそれを実行します:

> set.var.labels(data, var.labels)

役に立ちませんでした。ベクトルの値を返しますがvar.labels、変数ラベルは割り当てません。それを新しいオブジェクトに割り当てようとすると、変数ラベルの値がベクトルとして含まれているだけです。

4

4 に答える 4

31

これを行うには、の名前付きベクトルからリストを作成し、var.labelsそれを値に割り当てlabelます。の順序が列の順序と異なる場合でも、のmatch値が対応する列に確実にvar.labels割り当てられるように使用しました。datavar.labelsdata

library(Hmisc)

var.labels = c(age="Age in Years", sex="Sex of the participant")

label(data) = as.list(var.labels[match(names(data), names(var.labels))])

label(data)
                     age                      sex 
          "Age in Years" "Sex of the participant" 

元の回答

私の元の答えは を使用lapplyしましたが、これは実際には必要ありません。アーカイブ目的の元の回答は次のとおりです。

次を使用してラベルを割り当てることができますlapply

label(data) = lapply(names(data), function(x) var.labels[match(x, names(var.labels))])

lapplyリストまたはベクトルの各要素に関数を適用します。この場合、関数は の各値に適用され、 の現在の値に対応するnames(data)ラベル値が選択されます。var.labelsnames(data)

いくつかのチュートリアルを読むことは、一般的なアイデアを理解するための良い方法ですがlapply、さまざまな状況で使用を開始し、どのように動作するかを確認すると、実際にコツをつかむことができます.

于 2014-12-07T20:53:18.197 に答える