web-dev-qa-db-ja.com

data.frameからdata.frameとして単一の列を抽出するにはどうすればよいですか?

Data.frameがあるとします:

df <- data.frame(A=c(10,20,30),B=c(11,22,33), C=c(111,222,333))
  A  B  C
1 10 11 111
2 20 22 222
3 30 33 333

2つ(またはそれ以上)の列を選択すると、data.frameが取得されます。

x <- df[,1:2]
   A  B
 1 10 11
 2 20 22
 3 30 33

これは私が欲しいものです。ただし、1つの列のみを選択すると、数値ベクトルが取得されます。

x <- df[,1]
[1] 1 2 3

2つ以上の列の結果を変更しないas.data.frame()を使用しようとしました。 1列の場合はdata.frameを返しますが、列名は保持しません。

x <- as.data.frame(df[,1])
     df[, 1]
1       1
2       2
3       3

なぜこのように振る舞うのか分かりません。私の考えでは、1つ、2つ、または10の列を抽出しても違いはありません。 ITは常にベクトル(または行列)を返すか、常にdata.frameを(正しい名前で)返す必要があります。私は何が欠けていますか?ありがとう!

注:matrixとdata.frameはRでは基本的に異なるデータ型であり、dplyrでは異なる動作をする可能性があるため、これは行列に関する質問の複製ではありません。マトリックスではなくdata.frameで機能するいくつかの答えがあります。

35
rs028

つかいます drop=FALSE

> x <- df[,1, drop=FALSE]
> x
   A
1 10
2 20
3 30

ドキュメントから( ?"[" )以下を見つけることができます。

Drop = TRUEの場合、結果は可能な限り最小の次元に強制されます。

71
Jilber Urbina

,を省略します。

x <- df[1]

   A
1 10
2 20
3 30

?"["のヘルプページから:

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

データフレームはリストです。列はその要素です。

22
Sven Hohenstein