Rプログラミングにおけるリスト:要素の作成と選択方法

⚡ スマートサマリー

RのListは、ベクトル、行列、データフレーム、さらには他のリストを単一のコンテナに格納するオブジェクトです。list()関数で構築し、二重角括弧で要素を取り出すことができます。

  • 🧺 混合保管: リストは、異なる型や長さのオブジェクトを格納できますが、単純なベクトルではそれができません。
  • 🛠️ 構築手順: list(vect, mat, df) は、ベクトル、行列、データフレームを 1 つのオブジェクトにパックします。
  • 🔢 ポジションへのアクセス: my_list[[2]] は要素自体を返しますが、my_list[2] は要素が 1 つだけのリストを返します。
  • 🏷️ 名前付き要素: 要素の作成時にタグを付けることで、$ 演算子または [[“name”]] を介してアクセスできるようになります。
  • 会<XNUMXxEXNUMX><XNUMXxXNUMXF>️️<XNUMXxXNUMXF>️️ インプレース編集: 再代入は要素を更新し、NULLを代入するとリストから要素を削除します。
  • 🔗 平坦化: unlist() は、ネストされたリストを、後続の分析のために単一のアトミックベクトルに圧縮します。

Rリスト Rプログラミングでリストを作成し、要素を選択する

Rリストとは何ですか?

Rリスト は、行列、ベクトル、データ フレーム、またはリストを含む R プログラミングのオブジェクトです。 R List は、オブジェクトのコレクションを保存し、必要なときに使用するためにも使用されます。 R リストは、さまざまなアイテムを入れるためのバッグとして想像できます。 アイテムを使用するときは、バッグを開いて使用できます。

ベクトルとの対比こそが、バッグを便利なものにしている。ベクトルはすべての要素を1つの型に強制するため、数字の横に単語を置くと、その数字はテキストになる。リストにはそのようなルールは適用されないため、5要素のベクトルや2行のリストなどを扱うことができる。 マトリックス そして、714行のデータフレームを、いずれも変更せずに並べて表示します。

R のリストの構文

Rプログラミングでは、list()関数を使ってリストを作成できます。

list(element_1, ...)
arguments:
-element_1: store any type of R object
-...: pass as many objects as specifying. each object needs to be separated by a comma

各引数はそのまま渡すことも、次の形式で渡すこともできます。 タグ = 値裸の引数は、その番号でのみアクセスできる位置要素になりますが、タグ付き引数には名前も付けられます。R の基本リファレンス リスト() 両方の形式を文書化し、unlist() は as.list() の近似的な逆関数として機能していることを注記しています。

R でリストを作成する方法

以下は、R でリストを作成する方法を段階的に示したプロセスです。

以下の例では、Vector、Matrix、および XNUMX つの異なるオブジェクトを作成します。 データフレーム Rのリスト関数を使用します。

ステップ 1) ベクトルを作成する

以下のコードを使用して R でベクトルを作成します

# Vector with numeric from 1 up to 5
vect  <- 1:5

コロン演算子は、1、2、3、4、5 というシーケンスを整数ベクトルとして構築し、代入矢印はそれを vect という名前で格納します。

ステップ 2) マトリックスの作成

次に、以下のコードを使用して行列を作成します。

# A 2x 5 matrix
mat  <- matrix(1:9, ncol = 5)
dim(mat)

ここで注目すべき点が2つあります。2行5列のグリッドには10個の値が必要ですが、9個しか指定されていないため、Rはシーケンスを再利用し、データの長さが行数の約数ではないという警告を表示します。この再利用された値が原因で、表示される行列の2行目は10ではなく1で終わります。その後、dim()関数を呼び出すと、その形状が報告されます。

出力:

## [1] 2 5

ステップ 3) データフレームの作成

以下のコードを使用して R でデータ フレームを作成します

# select the 10th row of the built-in R data set EuStockMarkets
df <- EuStockMarkets[1:10,]

コメントでは10行目について言及されていますが、この式では組み込みのEuStockMarketsシリーズの1行目から10行目までが保持されます。また、サブセット化によって時系列クラスも削除されるため、返されるのは真のデータフレームではなく数値行列です。そのため、以下の出力結果では行名ではなく[1,]形式の行ラベルが使用されています。真のデータフレームが必要な場合は、呼び出しをas.data.frame()で囲んでください。

ステップ 4) R でリストを作成する

ここで、以下のコードを使用して XNUMX つのオブジェクトを R リストに入れることができます。

# Construct list with these vec, mat, and df:
my_list <- list(vect, mat, df)
my_list

出力:

## [[1]]
## [1] 1 2 3 4 5

## [[2]]
##       [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    5    7    9
## [2,]    2    4    6    8    1

## [[3]]
##          DAX    SMI    CAC   FTSE
##  [1,] 1628.75 1678.1 1772.8 2443.6
##  [2,] 1613.63 1688.5 1750.5 2460.2
##  [3,] 1606.51 1678.6 1718.0 2448.2
##  [4,] 1621.04 1684.1 1708.1 2470.4
##  [5,] 1618.16 1686.6 1723.1 2484.7
##  [6,] 1610.61 1671.6 1714.3 2466.8
##  [7,] 1630.75 1682.9 1734.5 2487.9
##  [8,] 1640.17 1703.6 1757.4 2508.4
##  [9,] 1635.47 1697.5 1754.0 2510.5
##  [10,] 1645.89 1716.3 1754.3 2497.4

その出力にある3つの二重角括弧のヘッダーは、リストの位置を示しています。何も平坦化や型変換はされていません。要素1は依然として整数ベクトルであり、要素2は依然として行列であり、要素3には依然として10行すべての株価データが格納されています。

R リストから要素を選択

リストを作成したら、簡単にアクセスできます。リスト内の要素を選択するには、[[index]]を使用する必要があります。二重角括弧内の値は、リスト内で選択したい項目の位置を表します。trac例えば、括弧の中に2を渡すと、Rはリストされている2番目の要素を返します。

今これで R チュートリアルR の my_list という名前のリストの 2 番目の項目を選択してみます。my_list[[XNUMX]] を使用します。

# Print second element of the list
my_list[[2]]

出力:

##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    5    7    9
## [2,]    2    4    6    8    1

単一括弧と二重括弧は互換性がなく、これらを混同することがリストエラーの最も一般的な原因です。括弧が1つの場合はラッパーを保持し、2つの場合はラッパーを削除します。

表現 何が戻ってくるのか 結果のクラス 次のようなときに使用します
my_list[[2]] 保存された要素自体 何が保存されたとしても、ここにマトリックスがある 1つの要素に対して計算を行う必要があります
my_list[2] その要素を1つ保持するサブリスト リスト リストラッパーを保持する必要があります
my_list[c(1, 3)] 選択された要素のサブリスト リスト 一度に複数の要素が必要です
my_list[-2] 2番目を除くすべての要素 リスト 要素をドロップする必要があります
# Compare the two bracket styles
class(my_list[[2]])   # the matrix itself
class(my_list[2])     # a list of length one

# Several elements, and everything but one element
my_list[c(1, 3)]
my_list[-2]

Rにおける名前付きリスト

位置インデックスは不安定です。要素を1つ挿入すると、その後のすべての数値がずれてしまいます。要素に名前を付けることで、このリスクが解消され、コードが記述対象のデータのように読みやすくなります。名前はリスト作成時に指定することも、後からnames()関数で追加することもできます。

# Tag each element at creation time
named_list <- list(numbers = vect, grid = mat, prices = df)

# Three ways to reach the same element
named_list$grid
named_list[["grid"]]
named_list["grid"]      # returns a one-element list

# Read or replace the names later
names(named_list)
names(named_list)[2] <- "grid_2x5"

$演算子と二重括弧には、初心者が戸惑う点が1つあります。$演算子は部分一致を行うため、named_list$priは価格を検索できますが、named_list[[“pri”]]は、exact = FALSEが指定されていない限り二重括弧が完全に一致するため、NULLを返します。部分一致はコンソールでは便利ですが、スクリプトでは安全ではないため、保存したコードでは完全一致形式を使用することをお勧めします。

# A compact map of the whole structure
str(named_list)

str() 関数は、要素ごとにその型とサイズを 1 行に出力します。これは、リストにアクセスする前に、リストに期待どおりの要素が含まれていることを確認する最も速い方法です。

Rリスト内の要素の変更、追加、削除

リストは作成後も固定されません。要素を読み取るアクセサーは、要素への書き込みにも使用されるため、リストの更新、拡張、縮小はすべて通常の代入操作で行われます。

# Replace an element in place
named_list[["numbers"]] <- 1:10

# Add a new element simply by naming it
named_list[["created"]] <- Sys.Date()

# Append without a name: the element lands at the end
named_list <- append(named_list, list(TRUE))

# Delete an element by assigning NULL to it
named_list[["created"]] <- NULL
  • 置換: 既存の名前を割り当てると、その要素は上書きされますが、位置は変更されません。
  • 追加: 存在しない名前を割り当てると、リストの末尾に新しい要素が追加されます。
  • 追加: append() は第 2 引数としてリストを受け取るため、値を渡す前にリスト() でラップする必要があります。
  • 削除: 二重括弧で囲んでNULLを代入すると、その要素が削除され、リストが短くなります。

よくある落とし穴の一つは、NULLは削除を意味するため、二重括弧で実際のNULLを格納することができない点です。代わりに、named_list[“empty”] <- list(NULL)のように、単一括弧による代入を使用してください。これにより、スロットが保持され、その中にNULLが格納されます。

Rにおけるネストされたリストとunlist()関数

リストはあらゆるRオブジェクトを格納できるため、別のリストを格納することも可能です。設定オブジェクト、JSONレスポンス、モデル結果などは、通常Rではネスト構造で表現されるため、ネストされたリストにアクセスしたり、リストをフラット化したりすることは日常的な作業です。

# A list whose elements are themselves lists
project <- list(
  meta = list(owner = "analyst", year = 2026),
  data = list(vect, mat)
)

# Chain the accessors to reach an inner value
project$meta$year
project[["data"]][[2]]

# Flatten every level into one atomic vector
flat <- unlist(project)

# Strip a single level and keep the rest as a list
half <- unlist(project, recursive = FALSE)

フラット化には理解しておくべきコストがあります。unlist() は必ず単一のアトミックベクトルを返す必要があるため、論理型、整数型、倍精度浮動小数点型、文字型の順に、存在するすべての値を最も一般的な型に強制変換します。そのため、数値とテキストが混在するネストされたリストは、完全にテキストとして返されます。結果の名前は外側のタグと内側のタグを結合して構築されるため、要素は owner ではなく meta.owner として返されます。

複合名が不要な場合は use.names = FALSE を渡し、最外層のみを削除する場合は recursive = FALSE を設定してください。値の型を保持する必要がある場合は、構造をそのままにしてリストをフラット化するのではなく、リストを順に処理してください。

Rの組み込みデータフレーム

リストには、ディスクやウェブから読み込んだデータが格納されることが多いため、データフレームがリストに格納される前にどのように取得されるかを確認しておくと便利です。独自のデータフレームを作成する前に、オンラインで入手可能な R データセットを見てみましょう。prison データセットは 714×5 次元です。tail() 関数を使用すると、データフレームの下部を簡単に確認できます。同様に、head() 関数はデータフレームの上部を表示します。head(df, 5) で表示する行数を指定できます。read.csv() 関数については、後ほど詳しく説明します。 Rでデータをインポートする チュートリアル。

PATH <-'https://raw.githubusercontent.com/guru99-edu/R-Programming/master/prison.csv'
df <- read.csv(PATH)[1:5]
head(df, 5)

出力:

##   X state year govelec black
## 1 1     1   80       0 0.2560
## 2 2     1   81       0 0.2557
## 3 3     1   82       1 0.2554
## 4 4     1   83       0 0.2551
## 5 5     1   84       0 0.2548

read.csv() の後に続く [1:5] は、最初の 5 行ではなく、最初の 5 列を選択します。これは、データフレーム自体が列のリストであるためです。リストに対して単一の角括弧でインデックスを指定すると、より小さなリストが返されますが、ここではその小さなリストもデータフレームです。

str を使用してデータ フレームの構造を確認できます。

# Structure of the data
str(df)

出力:

## 'data.frame':    714 obs. of  5 variables:
##  $ X      : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ state  : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ year   : int  80 81 82 83 84 85 86 87 88 89 ...
##  $ govelec: int  0 0 1 0 0 0 1 0 0 0 ...
##  $ black  : num  0.256 0.256 0.255 0.255 0.255 ...

すべての変数は次の場所に保存されます。 数値 フォーマット。各行の $ 接頭辞は、以前に名前付きリストで使用した演算子と同じであり、データフレームが長方形のラベルが付いた同じ長さの列のリストであることを確認します。したがって、リスト要素の名前付け、選択、削除について学んだことはすべて、直接適用されます。 Rのデータ型 そしてデータフレームの列へ。

よくあるご質問

ベクトルはすべての要素を単一の型に強制するため、テキストと数値を混在させると、すべてが文字型に変換されます。リストは、ベクトル、行列、長さの異なる関数など、各要素を元の形式のまま保持します。両者を区別するには、typeof() 関数を使用します。

is.list(x) を呼び出すと、リストとペアリストの場合は TRUE が返されます。class(x) はオブジェクトのクラスを報告し、typeof(x) はデータフレームの場合でも「list」を返します。これは、データフレームが等長の列のリストであるためです。

length(my_list) は最上位の要素のみをカウントするため、ネストされたリストも 1 つとしてカウントされます。lengths(my_list) は、すべての要素のサイズを 1 つの呼び出しで報告するため、loo よりも高速で分かりやすいです。ping 要素が異なる場合。

lapply(my_list, FUN) は function すべての要素に適用してリストを返します。sapply() は、可能な場合は結果をベクトルまたは行列に単純化します。seq_along(my_list) に対する単純な for ループも機能し、読みやすいです。

すべての要素の長さが同じ場合、as.data.frame(my_list) は直接機能します。幅が等しい行のリストの場合、do.call(rbind, my_list) は最初にそれらを積み重ねます。 dplyr 列の型を変更せずに保持する必要がある場合、エコシステムは as_tibble() を提供します。

リストには組み込みのソート機能がないため、tracta 比較可能なキーを最初に: my_list[order(sapply(my_list, length))] は要素のサイズで並べ替えます。長方形データの場合は、フレームに変換して データフレームをソートする 代わりに order() を使用してください。

AIアシスタントはstr()の出力を読み取り、インデックスが値ではなくNULLまたはサブリストを返した理由を説明します。また、正しい括弧の形式を提案したり、lapply()パイプラインのドラフトを作成したり、結果が破損する前にサイレント型変換を警告したりします。

Yes. GitHubコパイロット で働く Rstudio 2023.09.0以降は、「ツール」→「グローバルオプション」→「コードアシスタント設定」からアクセスできます。コメント内のlist()、names()、unlist()関数の呼び出しを補完しますが、すべての提案は確認が必要です。