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")
data
パッケージの関数label
を使用して、var.labels
の変数ラベルをデータフレームHmisc
の列に割り当てます。このように1つずつ実行し、後で結果を確認できます。
> 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
の値を返しますが、変数ラベルは割り当てません。新しいオブジェクトに割り当てようとすると、変数ラベルの値がベクトルとして含まれているだけです。
これを行うには、var.labels
の名前付きベクトルからリストを作成し、それをlabel
値に割り当てます。 var.labels
の順序がmatch
列の順序と異なっていても、data
を使用して、var.labels
の値がdata
の対応する列に割り当てられるようにしました。
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)
の各値に適用され、names(data)
の現在の値に対応するvar.labels
からラベル値を選択します。
いくつかのチュートリアルを読むことは、一般的なアイデアを得るための良い方法ですが、さまざまな状況でlapply
を使い始め、それがどのように動作するかを見ると、本当に理解できます。
Hmisc::upData()
関数を使用することを強くお勧めします。
ここで reprex の例:
set.seed(22)
data <- data.frame(age = floor(rnorm(6,25,10)),
sex = gl(2,1,6, labels = c("f","m")))
var.labels <- c(age = "Age in Years",
sex = "Sex of the participant")
dplyr::as.tbl(data) # as tibble ---------------------------------------------
#> # A tibble: 6 × 2
#> age sex
#> <dbl> <fctr>
#> 1 19 f
#> 2 49 m
#> 3 35 f
#> 4 27 m
#> 5 22 f
#> 6 43 m
data <- Hmisc::upData(data, labels = var.labels) # update data --------------
#> Input object size: 1328 bytes; 2 variables 6 observations
#> New object size: 2096 bytes; 2 variables 6 observations
Hmisc::label(data) # check new labels ---------------------------------------
#> age sex
#> "Age in Years" "Sex of the participant"
Hmisc::contents(data) # data dictionary -------------------------------------
#>
#> Data frame:data 6 observations and 2 variables Maximum # NAs:0
#>
#>
#> Labels Levels Class Storage
#> age Age in Years integer integer
#> sex Sex of the participant 2 integer
#>
#> +--------+------+
#> |Variable|Levels|
#> +--------+------+
#> | sex | f,m |
#> +--------+------+
ラベルのベクトルがdata.frame列の順序と一致するが、名前付きベクトルではない場合(したがって、他の回答のlapply
アプローチのように名前でdata.frame列をサブセット化するために使用することはできません)、forループを使用できます。
for(i in seq_along(data)){
Hmisc::label(data[, i]) <- var.labels[i]
}
label(data)
#> age sex
#> "Age in Years" "Sex of the participant"