web-dev-qa-db-ja.com

R:データフレーム列の変数ラベルを割り当てる

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の値を返しますが、変数ラベルは割り当てません。新しいオブジェクトに割り当てようとすると、変数ラベルの値がベクトルとして含まれているだけです。

20
panman

これを行うには、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を使い始め、それがどのように動作するかを見ると、本当に理解できます。

20
eipi10

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 |
#> +--------+------+
9
avallecam

ラベルのベクトルが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"
3
Sam Firke