リストまたはデータフレームの要素にアクセスするための括弧 [ ] と二重括弧 [[ ]] の違い

StackOverflow https://stackoverflow.com/questions/1169456

質問

R は、リストまたは data.frame の要素にアクセスするための 2 つの異なるメソッドを提供します。 [] そして [[]] オペレーター。

両者の違いは何ですか?どのような状況で一方を他方よりも使用する必要がありますか?

役に立ちましたか?

解決

R言語の定義は、ハンディの回答これらの問題の種類:

Rは基本的な割り出事業者は、書式で表示され、以下の実施例

    x[i]
    x[i, j]
    x[[i]]
    x[[i, j]]
    x$a
    x$"a"

のためのベクトルや行列の [[ 形態はほとんど使われていませんが、その若干の意味の違いから [ フォーム(例えばで任意の名称又はdimnames属性と一致部分一致の使用のための文字インデックス).が数多次元構造の単一の指標 x[[i]] または x[i] を返します。 ith要素の順序 x.

トのリストは、一般的に使用 [[ 選択単一の要素に対し [ リストを返しますを選択します。

[[ 形状で、単一要素のみを選択を整数または文字インデックスが [ 能指数付けによるベクトル.このリストのインデックスをベクターとの各要素に、ベクトルが適用され、一覧に選択したコンポーネント、つまり選択した部品のそのコンポーネントです。結果はまだ単一の要素です。

他のヒント

2つの方法の間の有意差は、それらが抽出に使用される場合、それらが割り当て中の値の範囲、または単に単一の値を受け入れることができるかどうかを返すオブジェクトのクラスである。

次のリスト上のデータ抽出のケースを考えてみます:

foo <- list( str='R', vec=c(1,2,3), bool=TRUE )

私たちがfooからブール値で格納された値を抽出し、if()文の内部でそれを使用したいと言います。これらはデータ抽出のために使用されているとき、これは[][[]]の戻り値の違いを説明します。 (fooがdata.frameた場合はdata.frame)[]方法は、そのクラス、その値の種類によって決定されたオブジェクトを返しながら[[]]メソッドは、クラスリストのオブジェクトを返します。

ですから、以下に[]メソッドの結果を使用します:

if( foo[ 'bool' ] ){ print("Hi!") }
Error in if (foo["bool"]) { : argument is not interpretable as logical

class( foo[ 'bool' ] )
[1] "list"
[]メソッドがリストを返され、リストはif()声明に直接渡すために有効なオブジェクトではありませんので、

このです。この場合、我々はそれが適切なクラスを持っています「ブール」に保存された「裸の」オブジェクトを返しますので、[[]]を使用する必要があります:

if( foo[[ 'bool' ]] ){ print("Hi!") }
[1] "Hi!"

class( foo[[ 'bool' ]] )
[1] "logical"

第二の差が[]オペレータが[[]]演算子はの単一のアクセスに制限されながら、データフレーム内のリストまたは列内のスロットのの範囲]をアクセスするために使用され得ることですのスロットまたは列。第二のリストを使用して値の割り当ての場合を考え、bar()

bar <- list( mat=matrix(0,nrow=2,ncol=2), rand=rnorm(1) )

私たちはバーに含まれるデータとのfooの最後の2つのスロットを上書きしてみたいと思います。我々は[[]]演算子を使用しようとすると、これは何が起こるかです:

foo[[ 2:3 ]] <- bar
Error in foo[[2:3]] <- bar : 
more elements supplied than there are to replace
[[]]は、単一の要素へのアクセスに制限されているため、

このです。私たちは、[]を使用する必要があります:

foo[ 2:3 ] <- bar
print( foo )

$str
[1] "R"

$vec
     [,1] [,2]
[1,]    0    0
[2,]    0    0

$bool
[1] -0.6291121

割り当てが成功であった、FOOのスロットが元の名前を維持することに注意してください。

ダブルブラケットアクセスリスト 要素, が、シングルブラケットでバリストを単一の要素です。

lst <- list('one','two','three')

a <- lst[1]
class(a)
## returns "list"

a <- lst[[1]]
class(a)
## returns "character"

[]は、リスト内の要素を抽出[[]]リストを抽出

alist <- list(c("a", "b", "c"), c(1,2,3,4), c(8e6, 5.2e9, -9.3e7))

str(alist[[1]])
 chr [1:3] "a" "b" "c"

str(alist[1])
List of 1
 $ : chr [1:3] "a" "b" "c"

str(alist[[1]][1])
 chr "a"

ハドレーウィッカムから:

tidyverse / purrr使用して表示するマイ(安っぽい探して)修正ます:

 loading=

"ここに画像の説明を入力します。

ただ、ここで追加するものために装備されている[[ の再帰的なインデックス

このは@JijoMatthewで答えにでほのめかしたが探求されていませんでした。

?"[["x[[y]]length(y) > 1、構文で述べたように、と解釈される:

x[[ y[1] ]][[ y[2] ]][[ y[3] ]] ... [[ y[length(y)] ]]

これは[[[の違いについてあなたのメインのテイクアウトがどうあるべきか変更されないことに注意してください - 前者はをサブセット化のために使用されているつまり、こと、および後者はの単一のリスト要素を抽出するのために使用されます。

たとえば、

x <- list(list(list(1), 2), list(list(list(3), 4), 5), 6)
x
# [[1]]
# [[1]][[1]]
# [[1]][[1]][[1]]
# [1] 1
#
# [[1]][[2]]
# [1] 2
#
# [[2]]
# [[2]][[1]]
# [[2]][[1]][[1]]
# [[2]][[1]][[1]][[1]]
# [1] 3
#
# [[2]][[1]][[2]]
# [1] 4
#
# [[2]][[2]]
# [1] 5
#
# [[3]]
# [1] 6

の値3を取得するには、我々が行うことができます:

x[[c(2, 1, 1, 1)]]
# [1] 3

@ JijoMatthewの答え以上、リコールrに戻っ行き方:

r <- list(1:10, foo=1, far=2)
つまり、

具体的には、これは我々が誤って使用する場合に取得する傾向があるエラーを説明し[[、ます:

r[[1:3]]
  

r[[1:3]]でエラーが発生しました:再帰インデックスはレベル2で失敗した。

このコードは、実際r[[1]][[2]][[3]]を評価しようとし、そしてrのネストがレベル1で停止するので、再帰的なインデクシングを介して抽出しようとすると、レベル2、即ち、[[2]]に失敗します。

  

r[[c("foo", "far")]]でエラーが発生しました:添字範囲外の

ここで、Rは存在しないr[["foo"]][["far"]]、探していたので、私たちは境界エラーのうちの添字を取得します。

これらのエラーの両方が同じメッセージを与えた場合は、

これはおそらく、もう少し便利/一致するであろう。

両方の方法subsetting.のシングルブラケットを返します。サブセットのリストは、自身がリストアップしました。ieでは一つ以上含みます。一方、ダブルブラケットを返し単一の要素をクリックします。

-シングルブラケットをリストアップしました。しても利用できるシングルブラケットした場合は再複数の要素をクリックします。考え、以下のリスト:-

>r<-list(c(1:10),foo=1,far=2);

今ごとのリストが返された時のみ表示します。ていただいたものとさせていたr"と入力し、enterキーを押し

>r

#the result is:-

[[1]]

 [1]  1  2  3  4  5  6  7  8  9 10

$foo

[1] 1

$far

[1] 2

現在のマジックのシングルブラケット:-

>r[c(1,2,3)]

#the above command will return a list with all three elements of the actual list r as below

[[1]]

 [1]  1  2  3  4  5  6  7  8  9 10

$foo

[1] 1


$far

[1] 2

そして、この試合の表示値のr画面で、利用のシングルブラケットは返されたリストでは、インデックス1としてベクトルの10の要素、そして二つの要素名fooです。まあ、単一のインデックスまたは要素名を入力としてのシングルブラケット.例:

> r[1]

[[1]]

 [1]  1  2  3  4  5  6  7  8  9 10

この例でした指数"1"の見返りとしたリストの中の一つの要素が配列の10数字)

> r[2]

$foo

[1] 1

上記の例ではまたインデックス"2"の見返りとしたリストの中の一つの要素

> r["foo"];

$foo

[1] 1

この例では、私たちの名前をひとつの要素およびリストを返し戻された一つの要素になります。

また、パスベクターの要素の名前のように:-

> x<-c("foo","far")

> r[x];

$foo

[1] 1

$far
[1] 2

この例ではまれたベクターとの二つの要素の名前を文字列"foo"および文字列""これまでに

見返りとしたリストは、つの要素からなる。

短シングルブラケットもありましたリストの要素数に等しい数の要素数を指すパスのシングルブラケット.

これに対し、ダブルブラケットも一要素となります。移る前にダブルブラケット注意を持って扱われる必要がありするとみられる。NOTE:THE MAJOR DIFFERENCE BETWEEN THE TWO IS THAT SINGLE BRACKET RETURNS YOU A LIST WITH AS MANY ELEMENTS AS YOU WISH WHILE A DOUBLE BRACKET WILL NEVER RETURN A LIST. RATHER A DOUBLE BRACKET WILL RETURN ONLY A SINGLE ELEMENT FROM THE LIST.

私はサイトの一部の例です。りください注意の言葉を大胆、ワークショップをおこなうた後は、以下に示す例:

ダブルブラケットを返します実際の値を指数です。であることを伝えてください ない リストを返します)

  > r[[1]]

     [1]  1  2  3  4  5  6  7  8  9 10


  >r[["foo"]]

    [1] 1

ダブルカッコいい眺望を一つ以上の要素を渡すことによってベクトルとなりますのでエラーがでませんでした築への対応を必要とするものだけを返す単一の要素です。

考え、以下の

> r[[c(1:3)]]
Error in r[[c(1:3)]] : recursive indexing failed at level 2
> r[[c(1,2,3)]]
Error in r[[c(1, 2, 3)]] : recursive indexing failed at level 2
> r[[c("foo","far")]]
Error in r[[c("foo", "far")]] : subscript out of bounds

めの初心者ナビゲートを通じて、マニュアル霧ので、もしもの [[ ... ]] 表記してい 崩壊 機能すなわち、あるとだいたいの"のデータを取得られるベクトル一覧やデータフレーム。あんこを使用する場合はデータからこれらのオブジェクトです。これらの簡単な例を明らかにし.

(x <- c(x=1, y=2)); x[1]; x[[1]]
(x <- list(x=1, y=2, z=3)); x[1]; x[[1]]
(x <- data.frame(x=1, y=2, z=3)); x[1]; x[[1]]

での例:

> 2 * x[1]
  x
1 2
> 2 * x[[1]]
[1] 2

ている語い的構造, [[ オペレーター 抽出物 要素のリストからは [ オペレーターか サブセット のリストアップしました。

あなたはsplit()機能で作成したデータフレームを選択したい場合、

は、さらに別の具体的なユースケースの場合、二重括弧を使用します。あなたは、キーフィールドに基づいてサブセットに、split()グループリスト/データフレームがわからない場合。あなたが複数のグループを操作したい場合、それらをプロットした場合にはなど、便利です。

> class(data)
[1] "data.frame"

> dsplit<-split(data, data$id)
> class(dsplit)
[1] "list"

> class(dsplit['ID-1'])
[1] "list"

> class(dsplit[['ID-1']])
[1] "data.frame"

加えて:

続いて、 リンク答え ここ。

以下に、次の点に対処する小さな例を示します。

x[i, j] vs x[[i, j]]

df1   <- data.frame(a = 1:3)
df1$b <- list(4:5, 6:7, 8:9)

df1[[1,2]]
df1[1,2]

str(df1[[1,2]])
str(df1[1,2])

以下、詳細な説明を参照してください。

I内蔵mtcars呼ばれるR、データフレーム使用しています。

> mtcars 
               mpg cyl disp  hp drat   wt ... 
Mazda RX4     21.0   6  160 110 3.90 2.62 ... 
Mazda RX4 Wag 21.0   6  160 110 3.90 2.88 ... 
Datsun 710    22.8   4  108  93 3.85 2.32 ... 
           ............

表の一番上の行は、列名を含むヘッダと呼ばれます。各水平線は後行の名前で始まり、その後実際のデータに続くデータ列を示しています。 行の各データメンバはセルと呼ばれている。

単角括弧 "[]" 演算子

セル内のデータを取得するために、我々は、その行と列を入力し、単一の角括弧「[]」演算子の座標。二つの座標は、コンマによって分離されています。換言すれば、座標は次いで、コンマに続く行の位置、で始まり、そして列の位置で終わります。順序が重要です。

例えば、1: - ここで最初の行、mtcarsの第2列からセルの値は

> mtcars[1, 2] 
[1] 6

例えば、2: - さらに、我々は数値座標の代わりに、行と列の名前を使用することができる

> mtcars["Mazda RX4", "cyl"] 
[1] 6 

ダブル角括弧 "[]" 演算子

我々は、二重角括弧「[]」演算子とデータフレーム列を参照する。

例えば、1: - 組み込みデータセットmtcarsの第九の列ベクトルを取得するために、我々はmtcarsを[9]の書き込み

  

mtcars [[9]    [1] 1 1 1 0 0 0 0 0 0 0 0 ...

例:2: - 私たちは、その名前で同じ列ベクトルを取得することができます。

  

mtcars [[ "AM"]]    [1] 1 1 1 0 0 0 0 0 0 0 0 ...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top