2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【R】変数を長文や日本語にするのはやめて、代わりにラベルを貼ろう!

2
Last updated at Posted at 2026-02-14

想定読者

  • 主にRStudioユーザー(他の環境では一部の表示が異なる可能性あり)
  • 変数名が長い英語になってしまう人
  • 変数名を日本語のままにしている人

1. はじめに

1.1 概要

 本記事では、Rで変数に安全に日本語の説明をつけることができるラベル機能について説明します。
 具体的には、irisデータを元に、①Rの標準機能 ②labelledパッケージ ③tinylabelsパッケージ の3つの方法を示します。
 結論から述べると「パッケージを使った方がよいが、どれを使うかは好みである」となります。

 なお、再現用のコード全文はGitHubから確認・ダウンロードできます。

1.2 なぜラベルを付けるのか?

変数に「詳細な説明を付与できたら便利だ」と感じたことはありませんか?
それを実現するのがラベル機能です。

そもそもプログラミングにおいて、以下の3点は論を俟たない鉄則です。

  1. 半角英数を用いるべき(日本語はバグの温床となるため避ける!)
  2. 長い変数名は可読性を下げる
  3. 過度に省略された変数名は可読性を下げる

しかし、現実には

  1. 元データが日本語の変数になっている1
  2. 複雑な変数のため、一言にまとめられない2
  3. そのまま英語だと長すぎるが、適度に省略できない
    頭文字だけ抜き出したところ、一目では意味の分からない名前になった。3
    (しかも、変数が多いのでアルファベット・スープに!)

といった問題が起こります。

 そこで、これらの問題を根本から解決するのが、ラベル機能の役割です。

1.3 ラベルの利点

 ラベルの大きな利点は、やはり変数に説明がつけられることです。RStudioであれば、以下のようにデータをView()した際に、変数名の下に説明がつけられるようになります。
 例えば、FCIという変数名に財政力指数というラベルを付ければ、それが何を意味するのか一目瞭然となります。

 また、同様に$演算子で変数を選択する際にも、説明が表示されるようになり、コードを書く時に情報を提供してくれます。

2. ラベルの付与・確認・除去

2.1 Rの標準機能

 パッケージを使わず、R標準の関数でラベルを貼ることができます。ただし、後述するパッケージによる方法よりも、コードが冗長になります。

 基本的に、ラベルを操作する際はattr(データ名$変数名, "label")に対し、ラベル名を入れたり、NULLを入れたりするだけで完結します。

### ラベルの付与
attr(df$Species, "label") <- "学名(3種類)"

### ラベルの確認
attr(df$Species, "label")

### ラベルの除去
attr(df$Species, "label") <- NULL

### 複数のラベルを付与
attr(df$Species,      "label") <- "学名(3種類)"
attr(df$Sepal.Length, "label") <- "萼片の長さ(cm)"
attr(df$Sepal.Width,  "label") <- "萼片の幅(cm)"
attr(df$Petal.Length, "label") <- "花弁の長さ(cm)"
attr(df$Petal.Width,  "label") <- "花弁の幅(cm)"

### 複数のラベルを確認
str(df)
lapply(df, function(x){attr(x, "label")}) # labelだけを表示

### 複数のラベルを除去
for (i in seq_along(df)) {
  attr(df[[i]], "label") <- NULL
}

2.2 labelledパッケージ

 パッケージの長所は、以下の2点が挙げられます。

  1. 複数のラベルを操作しやすいこと
  2. tidyverse風にパイプ関数で使える

 複数のラベルを付与する際は、var_label(データ名)listを渡すと省コードで実行できます。以下では、直接リストを作って渡していますが、もちろん別個に作ったリストを用いることもできます。

## パッケージの読み込み
pacman::p_load(tidyverse,
               magrittr,
               labelled)

### ラベルの付与
var_label(df$Species) <- "学名(3種類)"

### ラベルの確認
var_label(df$Species)

### ラベルの除去
var_label(df$Species) <- NULL
df$Species <- remove_labels(df$Species) # こちらも可

### 複数のラベルを付与
var_label(df) <- list(
  Species      = "学名(3種類)",
  Sepal.Length = "萼片の長さ(cm)",
  Sepal.Width  = "萼片の幅(cm)",
  Petal.Length = "花弁の長さ(cm)",
  Petal.Width  = "花弁の幅(cm)"
)

### 複数のラベルを付与(tidyverse風)
df %<>%
  set_variable_labels(
    Species      = "学名(3種類)",
    Sepal.Length = "萼片の長さ(cm)",
    Sepal.Width  = "萼片の幅(cm)",
    Petal.Length = "花弁の長さ(cm)",
    Petal.Width  = "花弁の幅(cm)"
  )

### 複数のラベルを確認
var_label(df)

### 複数のラベルを除去
df <- remove_labels(df)

2.3 tinylabelsパッケージ

 tinylabelsパッケージでは、複数のラベルを付与する際はvariable_label(データ名)c()でベクトルを渡すと省コードで実行できます。
 なお、variable_labelではなくvariable_labels(sを追加)でも同じ結果になります。

## パッケージの読み込み
pacman::p_load(tidyverse,
               magrittr,
               tinylabels)
### ラベルの付与
variable_label(df$Species) <- "学名(3種類)"
variable_label(df) <- c(Species = "学名(3種類)") # こちらも可

### ラベルの確認
variable_label(df$Species)

### ラベルの除去
df$Species <- unlabel(df$Species)

### 複数のラベルを付与
variable_label(df) <- c(
  Species      = "学名(3種類)",
  Sepal.Length = "萼片の長さ(cm)",
  Sepal.Width  = "萼片の幅(cm)",
  Petal.Length = "花弁の長さ(cm)",
  Petal.Width  = "花弁の幅(cm)"
)

### 複数のラベルを付与(tidyverse風)
df %<>%
  label_variables(
    Species      = "学名(3種類)",
    Sepal.Length = "萼片の長さ(cm)",
    Sepal.Width  = "萼片の幅(cm)",
    Petal.Length = "花弁の長さ(cm)",
    Petal.Width  = "花弁の幅(cm)"
  )

### 複数のラベルを確認
variable_label(df)

### 複数のラベルを除去
df <- unlabel(df)

3. ラベルを保存する(csv, RData, RDS)

 ラベルを保ったままデータを保存するには、データの種類によって対応が異なります。
 RDataRDSとして保存する場合は、以下のようにそのままのコードで上手くいきます。

## RData
save(df, file = "output/df.RData")
# load("output/df.RData")

## RDS
saveRDS(df, "output/df.rds")
# df <- readr::read_rds("output/df.rds")

 csvで保存する際は以下の工夫が必要です。なお、これをパイプ関数かつ省コードで実現できるのはlabelledパッケージのみです。

  1. 本データはそのままcsvで保存する
  2. 新たに、「変数名」と「ラベル名」からなるlabelデータを作り、別途csvで保存する
  3. labelデータを読み込んだ後、tibble::deframe()を用いて名前付きベクトルにする
  4. 本データを読み込んだ後、labelled::set_variable_labels(.labels = labelデータ)でラベルを再付与する
### データはそのままcsvに
readr::write_excel_csv(df, "output/iris.csv")

### ラベルを前処理をしてからcsvに
df_label <-
  tibble(
    variable = colnames(df),
    label    = labelled::var_label(df, unlist = TRUE)
  )
readr::write_excel_csv(df_list, "output/iris_label.csv")

### csvから読み込む
df_label <-
  arrow::read_csv_arrow("output/iris_label.csv") %>% 
  deframe()

df <- arrow::read_csv_arrow("output/iris.csv") %>%
  labelled::set_variable_labels(.labels = df_label)

4. どの方法がよいの?

 labelledパッケージが最も便利で、多機能です。
 
 まず、Rの標準関数はコードの冗長性などが気になります。その問題点を解消するのが両パッケージです。
 次いで、両パッケージを比較すると、tinylabelsパッケージはその名の通り、最小限の機能しか含まれていません。「3. ラベルを保存する(csv, RData, RDS)」で示したように、より省コードが実現できるのはlabelledパッケージです。

ただし、tinylabelsパッケージには
①他のパッケージに見られる、複雑な依存関係や競合の問題がない
variableラベルのみ実装し、valueラベルを実装していない(詳しくは6.余談
といった最小限の機能にする工夫があり、シンプルさではこちらに軍配が上がります(参考)。

5. 説明以外の用途(検索・作図)

 これまで変数に説明がつけられるメリットを中心に紹介してきましたが、パッケージを用いれば、検索作図の際にもラベルを有効活用することができます。

5.1 検索

 列数が大量にある大規模データの場合、変数名だけでなく、ラベル名でも検索できれば便利です。labelled::look_for関数を用いれば、特定の文字列を含む変数を抜き出すことができます。

image.png

5.2 作図

 図として出力する際は、半角英数のままではなく、日本語にして出力する場合がほとんどだと思います。ラベルを設定していると、そちらが優先され、写真のafterのようにラベルの内容が反映されます。ラベルを設定していなければbeforeのように元の変数名が表示されます。
 なお、これらはlabs()で上書きすることも可能です。

plot.png

6. 結論

便利さを求めるならパッケージを用いるべき。
多機能を求めるなら、labelledパッケージ。
簡潔さを求めるなら、tinylabelsパッケージ。

どのパッケージを使用するかは、好みの範疇です。

7. 余談

 Rのラベル機能はSTATAやSASが元ネタ?と思われるのですが、どうやらvariableラベルとvalueラベルの2種類が存在するようです。前者が今回紹介したもので、後者が以下のように新しい列のような存在です。

image.png

 valueラベルは単に「1,2,……」と操作化されたデータを「1=yes, 2=no, ……」のように簡単に変換・作図できるといった点がメリットだと思われますが、それならばdplyrパッケージのcase_whenなどで十分に同じことができます。おそらく、dplyrで完結させる方が学習コスト的にも、実務的にも楽だと思われるため、今回は紹介していません。

実行環境

Rやパッケージのバージョン
> sessionInfo()
R version 4.5.1 (2025-06-13 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 11 x64 (build 26200)

Matrix products: default
  LAPACK version 3.12.1

locale:
[1] LC_COLLATE=Japanese_Japan.utf8  LC_CTYPE=Japanese_Japan.utf8   
[3] LC_MONETARY=Japanese_Japan.utf8 LC_NUMERIC=C                   
[5] LC_TIME=Japanese_Japan.utf8    

time zone: Asia/Tokyo
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] tinylabels_0.2.5 labelled_2.14.1  magrittr_2.0.3   lubridate_1.9.4  forcats_1.0.0   
 [6] stringr_1.5.2    dplyr_1.1.4      purrr_1.1.0      readr_2.1.5      tidyr_1.3.1     
[11] tibble_3.3.0     ggplot2_4.0.1    tidyverse_2.0.0 

loaded via a namespace (and not attached):
 [1] bit_4.6.0          gtable_0.3.6       compiler_4.5.1     tidyselect_1.2.1  
 [5] assertthat_0.2.1   arrow_22.0.0       scales_1.4.0       R6_2.6.1          
 [9] generics_0.1.4     pillar_1.11.1      RColorBrewer_1.1-3 tzdb_0.5.0        
[13] rlang_1.1.6        utf8_1.2.6         stringi_1.8.7      S7_0.2.0          
[17] bit64_4.6.0-1      timechange_0.3.0   cli_3.6.5          withr_3.0.2       
[21] grid_4.5.1         rstudioapi_0.17.1  haven_2.5.5        hms_1.1.3         
[25] lifecycle_1.0.4    vctrs_0.6.5        glue_1.8.0         farver_2.1.2      
[29] pacman_0.5.1       tools_4.5.1        pkgconfig_2.0.3   

参考文献

  1. 例えば、e-Statのデータは全てそうなっている。

  2. 例えば、「扶養控除対象者」のうち「特定扶養親族」に該当する人数を英語名にすると、number_of_specific_dependents_for_deductionとなる。

  3. 例えば、財政力指数(financial strength index)を省略するとFCIになるが、一目では何を表しているか不明。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?