18

data.frame 内の列の呼び出しの違いに関する情報は、次の場所で見つけることができます。

df <- data.frame(x=1:20,y=letters[1:20],z=20:1)

df$x
df["x"]

どちらも「同じ」結果を返しますが、必ずしも同じ形式であるとは限りません。私が気付いたもう 1 つのことは、df$x がリストを返すことです。一方、df["x"] は data.frame を返します。

編集: ただし、どの状況でどれを使用するかを知ることは課題になっています. ここにベスト プラクティスはありますか、それとも、コマンドまたは関数が必要とするものを知ることに本当に帰着しますか? これまでのところ、関数が最初に機能しない場合 (試行錯誤) を循環してきました。

4

7 に答える 7

16

もう1つの違いは、サンプルデータフレームでエラーをdf$w返しNULLたり返しdf['w']たりすることです。df[['w']]

于 2010-07-30T12:54:52.003 に答える
14

df$xは と同じですdf[['x']][[単一の要素を選択するために使用されます[が、選択された要素のリストを返します。言語リファレンスも参照してください。[[ はリストに、[ は配列に、$ は単一の列または要素を取得するために使用されます。式 (たとえば、df[[name]] または df[,name]) が必要な場合は、[ または [[ 表記も使用します。[ 表記は、複数の列が選択されている場合にも使用されます。たとえば、df[,c('name1', 'name2')] です。これにはベストプラクティスはないと思います。

于 2010-07-30T06:22:32.293 に答える
9

マニュアルのインデックス ページに加えて、ヘルプ ページ ?"$" で次の簡潔な説明を見つけることができます。

'[' によるインデックス付けは、アトミック ベクトルに似ており、指定された要素のリストを選択します。

'[[' と '$' は両方とも、リストの 1 つの要素を選択します。主な違いは、'$' は計算されたインデックスを許可しないのに対し、'[[' は許可することです。'x$name' は 'x[["name", exact = FALSE]]' と同等です。また、'[[' の部分一致動作は、'exact' 引数を使用して制御できます。

もちろん、関数呼び出しは異なります。get("[.data.frame")get("[[.data.frame")対を見るget("$")

于 2010-07-30T19:02:57.080 に答える
7

$この例では、ほとんどの用途で、サブセット化を完全に避け、何を覚えようと[[[、データ フレームを処理します。私はちょうど使用しますwith()

> df <- data.frame(x = 1:20, y = letters[1:20], z = 20:1)
> with(df, y)
 [1] a b c d e f g h i j k l m n o p q r s t
Levels: a b c d e f g h i j k l m n o p q r s t

これは、ほとんどの場合、どのサブセット方法よりもはるかに明確です (IMHO)。

于 2010-09-21T18:32:06.927 に答える
6

明示的に説明されていないことの 1 つは、変数または式の値に基づいて選択するために使用できますが、使用[できないということです。あなたができるIE:[[$

> example_frame <- data.frame(Var1 = c(1,2), Var2 = c('a', 'b'))
> x <- 'Var1'

> example_frame$x
NULL  # Not what you wanted

> example_frame[x]
  Var1
1    1
2    2

> example_frame[[x]]
[1] 1 2

> example_frame[[ paste(c("V","a","r",2), collapse='') ]]
[1] a b
Levels: a b

との違いは[他の投稿他の質問[[で十分にカバーされています。

于 2011-01-09T22:12:29.087 に答える
5

df["x"] の代わりに df[,"x"] を使用すると、df$x と同じ結果が得られます。コンマは、列を名前で選択していることを示します。

于 2010-07-30T15:00:17.257 に答える
0

df$xそしてdf[[x]]同じことをします。

という名前のデータセットがあるとしますone。これらの変数の 1 つが因子変数ですRegion。を使用one$Regionすると、特定の変数を選択できます。次の点を考慮してください。

one <- read.csv("IED.csv")
one$Region

次のコードを実行すると、その変数/レベルを分離することもできます。

one[["Region"]]

各コードは、次の出力を生成します。

> one$Region
    [1] RC SOUTH      RC SOUTH      RC SOUTH      RC EAST       RC EAST      
    [6] RC EAST       RC EAST       RC EAST       RC EAST       RC EAST      
   [11] RC SOUTH      RC SOUTH      RC EAST       RC EAST       RC EAST      
   [16] RC EAST       RC EAST       RC SOUTH      RC SOUTH      RC EAST      
   [21] RC SOUTH      RC EAST       RC CAPITAL    RC EAST       RC EAST 


> one[["Region"]]
    [1] RC SOUTH      RC SOUTH      RC SOUTH      RC EAST       RC EAST      
    [6] RC EAST       RC EAST       RC EAST       RC EAST       RC EAST      
   [11] RC SOUTH      RC SOUTH      RC EAST       RC EAST       RC EAST      
   [16] RC EAST       RC EAST       RC SOUTH      RC SOUTH      RC EAST      
   [21] RC SOUTH      RC EAST       RC CAPITAL    RC EAST       RC EAST 

「どちらも「同じ」結果を返しますが、必ずしも同じ形式であるとは限りません。」- 違いはわかりませんでした。各コマンドは、同じ形式で同じ出力を生成しました。おそらくあなたのデータです。

それが役立つことを願っています。

編集:

元の質問を読み間違えました。df["x"]以下を生成します。

> one["Region"]
             Region
1          RC SOUTH
2          RC SOUTH
3          RC SOUTH
4           RC EAST
5           RC EAST
6           RC EAST
7           RC EAST
8           RC EAST
9           RC EAST
10          RC EAST

なぜ違いが生じるのかわかりません。

于 2010-07-30T12:48:30.293 に答える