データフレームの行を削除するにはどうすればよいですか?


224

次のような「mydata」という名前のデータフレームがあります。

   A  B  C   D 
1. 5  4  4   4 
2. 5  4  4   4 
3. 5  4  4   4 
4. 5  4  4   4 
5. 5  4  4   4 
6. 5  4  4   4 
7. 5  4  4   4 

行2、4、6を削除します。たとえば、次のように:

   A  B  C   D
1. 5  4  4  4 
3. 5  4  4  4 
5. 5  4  4  4 
7. 5  4  4  4 

12
また、データを操作するためのいくつかの一般的な用語に慣れることもできます。これは通常、サブセットと呼ばれ、Googleで「rサブセットデータフレーム」を検索すると、非常に役立つUCLA R FAQページが表示されます。ところで、Stackoverflowへようこそ。
A5C1D2H2I1M1N2O1R2T1 2012

@mrdwabの優れた回答に加えて、ブールベクトルを使用してサブセット化するいくつかの追加の方法を追加しました。
Paul Hiemstra 2012

2
@ A5C1D2H2I1M1N2O1R2T1:RサブセットのUCLA FAQが移動しました。今ここにあります
マイクシェリル「キャットリコール」

回答:


340

重要なアイデアは、削除する行のセットを形成し、そのセットの補集合を保持することです。

Rでは、集合の補集合は「-」演算子で指定されます。

したがって、data.frameが呼び出されていると仮定しますmyData

myData[-c(2, 4, 6), ]   # notice the -

もちろん、myDataそれらの行を完全に削除したい場合は、「再割り当て」を忘れないでください。それ以外の場合、Rは結果を出力するだけです。

myData <- myData[-c(2, 4, 6), ]

59
,そこに注意することを忘れないでください!;)
Steven Jeuris、2015年

5
データフレームが1列のみの場合はどうなりますか。それは構造全体を落とし、値のベクトルを出力するようです
road_to_quantdom

6
@road_to_quantdom、drop = FALSEそこにa を追加します。
A5C1D2H2I1M1N2O1R2T1 2015年

4
「Rでは、セットの補数は「-」演算子によって与えられます」->これは非常に誤解を招く表現です。負のインデックスが削除され、それだけです。補数の概念はありません。論理-演算子を使用していて、それを使用しようとしても機能しません。論理演算子の補数演算子がだからです!。行のc(2,4,6)の補数はむしろsetdiff(c(2,4,6)、1:nrow(myData))であり、c(-2、-4、-6)ではありません。ただし、と一緒に使用すると、両方とも同じ行を生成し[ます。
asac

2
@Speldosa 、 myData[-c(2, 4, 6),,drop=F]. 実際、マトリックスアクセスで,drop=Fは常に直前に挿入することをお勧めします]
Aaron McDaid

82

いわゆるブールベクトル(別名logical

row_to_keep = c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE)
myData = myData[row_to_keep,]

注意!オペレータではない、すなわちとして機能!TRUE == FALSE

myData = myData[!row_to_keep,]

これは@mrwabの回答(+1 btw :))と比較すると少し扱いに​​くいように見えますが、論理ベクトルはその場で生成できます(列の値が特定の値を超える場合など)。

myData = myData[myData$A > 4,]
myData = myData[!myData$A > 4,] # equal to myData[myData$A <= 4,]

ブールベクトルをインデックスのベクトルに変換できます。

row_to_keep = which(myData$A > 4)

最後に、非常に巧妙なトリックは、この種のサブセットを抽出だけでなく割り当てにも使用できることです。

myData$A[myData$A > 4,] <- NA

Aが割り当てられているNA(番号でAはない)場合、4を超えます。


それらを除外したい場合はどうなりますか?例3では、衰退した場合
ガブリエルモンテネグロ2016

61

行番号による削除の問題

すばやくダーティな分析を行うには、上位の回答に従って、data.frameの行を番号で削除できます。つまり、

newdata <- myData[-c(2, 4, 6), ] 

ただし、堅牢なデータ分析スクリプトを記述しようとしている場合は、通常、数値の位置で行を削除しないでください。これは、データの行の順序が将来変更される可能性があるためです。data.frameまたはデータベーステーブルの一般的な原則は、行の順序は重要ではないということです。順序が重要な場合は、これをdata.frameの実際の変数にエンコードする必要があります。

たとえば、データを検査し、削除したい行の行番号を特定した後で、データセットをインポートし、数値位置で行を削除したとします。ただし、後の時点で、生データにアクセスして、データを調べて並べ替えます。行削除コードは誤った行を削除するようになり、さらに悪いことに、これが発生したことを警告するエラーが発生することはほとんどありません。

より良い戦略

より良い戦略は、行の実質的で安定したプロパティに基づいて行を削除することです。たとえば、id各ケースを一意に識別する列変数がある場合、それを使用できます。

newdata <- myData[ !(myData$id %in% c(2,4,6)), ]

また、指定できる正式な除外基準があり、Rの多くのサブセットツールの1つを使用して、そのルールに基づいてケースを除外することもできます。


11

データフレームにid列を作成するか、列名を使用して行を識別します。インデックスを使用して削除するのは公平ではありません。

subset関数を使用して新しいフレームを作成します。

updated_myData <- subset(myData, id!= 6)
print (updated_myData)

updated_myData <- subset(myData, id %in% c(1, 3, 5, 7))
print (updated_myData)

9

簡単なシーケンスで:

mydata[-(1:3 * 2), ]

シーケンス:

mydata[seq(1, nrow(mydata), by = 2) , ]

負のシーケンス:

mydata[-seq(2, nrow(mydata), by = 2) , ]

または、奇数を選択してサブセット化したい場合:

mydata[which(1:nrow(mydata) %% 2 == 1) , ]

または、奇数を選択してサブセット化する場合は、バージョン2を使用します。

mydata[which(1:nrow(mydata) %% 2 != 0) , ]

または、偶数を除外してサブセット化したい場合:

mydata[!which(1:nrow(mydata) %% 2 == 0) , ]

または、偶数をフィルタリングしてサブセット化する場合は、バージョン2を使用します。

mydata[!which(1:nrow(mydata) %% 2 != 1) , ]

5

ダンをemployee.dataから削除します-新しいdata.frameを管理する必要はありません。

employee.data <- subset(employee.data, name!="Dan")

0

これは、インデックスによって行を削除するための迅速でダーティな関数です。

removeRowByIndex <- function(x, row_index) {
  nr <- nrow(x)
  if (nr < row_index) {
    print('row_index exceeds number of rows')
  } else if (row_index == 1)
  {
    return(x[2:nr, ])
  } else if (row_index == nr) {
    return(x[1:(nr - 1), ])
  } else {
    return (x[c(1:(row_index - 1), (row_index + 1):nr), ])
  }
}

これは、row_index引数が値のベクトルであるというRパターンに従っていないことが主な欠点です。私はそれを書いてテストするのに数分しか費やしておらず、ここ数週間でRを使い始めたばかりなので、他の問題があるかもしれません。これに関するコメントや改善は大歓迎です!


0

完全を期すために、これはdplyrを使用しても実行できることを付け加えますslice。これを使用する利点は、パイプワークフローの一部になることができることです。

df <- df %>%
  .
  .
  slice(-c(2, 4, 6)) %>%
  .
  .

もちろん、パイプがなくても使用できます。

df <- slice(df, -c(2, 4, 6))

「ないベクター」、フォーマット-c(2, 4, 6)され、すべてを取得するための手段ないは、行2、4、6にない。範囲を使用する例として、最初の5行を削除したいとしますslice(df, 6:n())。その他の例については、ドキュメントをご覧ください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.