17

これが尋ねられて反対票を投じられることを非常に恐れていますが、ドキュメント (?"[") で答えが見つからず、検索が難しいことがわかりました。

data(wines)
# This is allowed:
alcoholic <- wines[, 1]
alcoholic <- wines[, "alcohol"]
nonalcoholic <- wines[, -1]
# But this is not:
fail <- wines[, -"alcohol"]

私は2つの解決策を知っていますが、それらの必要性に不満を感じています.

win <- wines[, !colnames(wines) %in% "alcohol"]  # snappy
win <- wines[, -which(colnames(wines) %in% "alcohol")]  # snappier!
4

6 に答える 6

8

別の可能性:

subset(wines,select=-alcohol)

あなたもできる

subset(wines,select=-c(alcohol,other_drop))

実際、削除したい列の連続したセットがある場合は、

subset(wines,select=-(first_drop:last_drop))

これは便利です(ただし、IMOは列の順序に危険なほど依存していますが、これは壊れやすい可能性がありgrepます。列を識別する方法、または列グループのより明示的な個別の定義があれば、ベースのソリューションを好むかもしれません) .

この場合subset、非標準評価を使用しています。これは、他の場所で説明されているように、状況によっては危険な場合があります。しかし、その可読性から、シンプルでトップレベルのデータ操作には依然として気に入っています。

于 2013-09-05T12:59:19.187 に答える
6

数値インデックスを使用し、類似した名前の列の束を削除したい状況に一般化する別の方法:

dfrm[ , -grep("^val", names(dfrm) )] #remove columns starting with "val"

(彼の答えは「マイナス記号」が機能しない「理由」を説明していたので、フローデルに投票しました。本質的には、R の作成者がその目的のために「-」演算子をオーバーロードしなかったためです。彼らはまたオーバーロードしませんでした」 +" を使用して、一部の言語と同じ方法で連結を行います。

于 2013-09-05T11:18:20.343 に答える
3

簡単な小さな関数を書いて、あなたの.Rprofile. 何かのようなもの...

dropcols <- function( df , cols ){
  out <- df[ , !names(df) %in% cols]
  return( out )
}

#  To use it....
data( mtcars )
head( dropcols( mtcars , "mpg" ) )
#                  cyl disp  hp drat    wt  qsec vs am gear carb
#Mazda RX4           6  160 110 3.90 2.620 16.46  0  1    4    4
#Mazda RX4 Wag       6  160 110 3.90 2.875 17.02  0  1    4    4
#Datsun 710          4  108  93 3.85 2.320 18.61  1  1    4    1
#Hornet 4 Drive      6  258 110 3.08 3.215 19.44  1  0    3    1
#Hornet Sportabout   8  360 175 3.15 3.440 17.02  0  0    3    2
#Valiant             6  225 105 2.76 3.460 20.22  1  0    3    1
于 2013-09-05T10:59:39.823 に答える
3

ドキュメントでこれを見つけることができませんが、次の構文は で機能しdata.tableます。

dt = data.table(wines)

dt[, !"alcohol", with = F]

また、必要に応じて列のリストを作成することもできます:

dt[, !c("Country", "alcohol"), with = F]

v1.8.4のNEWSに記載されたばかりのようです:

with=FALSE の場合、「!」j のプレフィックス、#1384ii の場合もあります。これにより、名前付きの列を除くすべてが選択されます。

DF[,-match("somecol",names(DF))]
# works when somecol exists. If not, NA causes an error.

DF[,-match("somecol",names(DF),nomatch=0)]
# works when somecol exists. Empty data.frame when it doesn't, silently.

DT[,-match("somecol",names(DT)),with=FALSE]
# same issues.

DT[,setdiff(names(DT),"somecol"),with=FALSE]
# works but you have to know order of arguments, and no warning if missing

DT[,!"somecol",with=FALSE]
# works and easy to read. With (helpful) warning if somecol isn't there.

しかし、上記のすべては、削除されたもの以外のすべての列をコピーします。より通常:

DT[,somecol:=NULL]

参照によって名前で列を削除します。

于 2013-09-05T16:03:12.357 に答える