53

次のように、R データ フレーム (またはマトリックス) から列を抽出できることに精通しています。

df.2 <- df[, c("name1", "name2", "name3")]

しかし、リストされた列以外のすべて!を選択するために、または他のツールを使用できますか?

背景として、かなりの数の列ベクトルを持つデータ フレームがあり、避けたいと思います。

  • 少数派を削除できたときに大部分の名前を入力する
  • df.2 <- df[, c(1,3,5)]私の.csvファイルが変更されると、番号付けが同じでなくなるため、コードがうまくいかないため、はるかに短いものを使用します。私はRが初めてで、変更される可能性のあるより大きなdfに数値ベクトルを使用しないという難しい方法を学んだと思います。

私は試した:

df.2 <- df[, !c("name1", "name2", "name3")]
df.2 <- df[, !=c("name1", "name2", "name3")]

そして、これを入力しているときに、これが機能することがわかりました:

df.2 <- df[, !names(df) %in% c("name1", "name2", "name3")]

この最後の方法よりも良い方法はありますか?

4

6 に答える 6

36

に代わるものgrepwhich次のとおりです。

df.2 <- df[, -which(names(df) %in% c("name1", "name2", "name3"))]
于 2012-08-31T18:12:26.240 に答える
12

また、negative-grep を使用すると、より一般化できる短い呼び出しを行うことができます。

df.2 <- df[, -grep("^name[1:3]$", names(df) )] 

grep は数値を返すため、負のベクトル インデックスを使用して列を削除できます。さらに多くのパターンまたはより複雑なパターンを追加できます。

于 2012-08-31T04:58:00.960 に答える
2

データを操作するために独自に使用している場合は、これを行うカスタム関数を作成できます。私はこのようなことをするかもしれません:

rm.col <- function(df, ...) {
    x <- substitute(...())
    z <- Trim(unlist(lapply(x, function(y) as.character(y))))
    df[, !names(df) %in% z]
}

rm.col(mtcars, hp, mpg)

最初の引数はデータフレーム名です。以下...は、削除したい列の名前です。

于 2012-08-31T02:42:56.753 に答える
0

私の頭に浮かぶ最も簡単な方法:

filtered_df<-df[, setdiff(names(df),c("name1","name2") ]

基本的に、列名の完全なリストと除外したいサブセット (上記の name1 と name2) との間の差を計算しています。

于 2015-11-08T01:18:41.517 に答える