web-dev-qa-db-ja.com

データフレームの行を削除する方法

このように見える "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 
181
R newbie

重要なことは、削除したい行のセットを形成し、そのセットを補完することです。

Rでは、集合の補数は ' - '演算子によって与えられます。

data.framemyDataと呼ばれると仮定します。

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

もちろん、それらの行を完全に削除したい場合はmyDataを "再割り当て"することを忘れないでください - そうでなければ、Rは単に結果を出力します。

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

いわゆるブールベクトル、別名logicalを使って作業することもできます。

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

!演算子はNOT、つまり!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を超えます。

68
Paul Hiemstra

行番号による削除の問題

迅速で汚い分析のために、あなたは一番上の答えに従って数によってdata.frameの行を削除することができます。すなわち、

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

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

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

より良い戦略

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

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

それ以外の場合は、指定できる正式な除外基準があり、その規則に基づいてケースを除外するためにRの多数のサブセットツールの1つを使用できます。

46
Jeromy Anglim

データフレームに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)

単純化された順序で:

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) , ]
6

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

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

これは、インデックスで行を削除するための手間のかかる関数です。

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
Alan Carlyle