例えば、データセットmtcars
mtcars[ , "cyl"]
そして
mtcars[ , 2]
どちらも同じ列を返します。したがって、次のようにして列 2 以外のすべてを取得できます。
mtcars[ , -2]
私はこれを期待していません:
mtcars[ , -"cyl"]
Error in -"cyl" : invalid argument to unary operator
代わりに私が思いつく最善の策は次の通りです:
mtcars[ , !colnames(mtcars)=="cyl"]
もっと簡単な解決策はありますか?
編集: 最初の 2 つの手法が機能するのであれば、次の 2 つの手法も機能するはずであるというのは論理的に思えます。何か見落としているだけであればいいのですが。またはのヘルプ ページでは、?"["
この?subset
直感に反する結果について説明されていません。なぜそうなるのか、誰か知っていますか?
ベストアンサー1
[編集:]負の文字列インデックスが機能しない理由の説明:
-()
は関数であり、R の開発者は、文字ベクトルでは使用できないと言っています (文字列の否定が意味をなさないからだけではありません)。文字ベクトルを否定できないため、列を削除するために負の文字列を指定することはできません。問題は にあり-
、引用したエラー メッセージの原因です。したがって、負のインデックスは数値にのみ機能するというルールがあります。元のエラーの原因は次のとおりです。
> -"cyl"
Error in -"cyl" : invalid argument to unary operator
質問へのコメントでは、 の否定形が で"cyl"
あるとの混乱がありました"-cyl"
が、これはそうではなく、単なる別の文字列です。上記の R スニペットは、質問で試みられたサブセット化で何が起こっていたかを示しています。
セクション2.7「のR入門「マニュアルでは、サブセット化の許可される方法について説明しています。
[オリジナル:]コンポーネントを削除する最も簡単な方法は、そのコンポーネントを次のように設定することですNULL
。
> cars <- mtcars
> cars[, "cyl"] <- NULL ## or cars$cyl <- NULL
> names(cars)
[1] "mpg" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear" "carb"
[編集:]名前付き列を一時的に削除することが望ましいことを示す Q の編集を考慮すると、次のようになります。
subset(mtcars, select = -cyl)
または
mtcars[, !names(mtcars) %in% "cyl"]
はオプションであり、前者の方が後者よりもクリーンです。