NAの特定の列を含む行を省略


129

NAデータフレームの値を省略する方法を知りたいのですが、関心があるのは一部の列だけです。

例えば、

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))

しかし、私はデータのみを省略したいyされNA、したがって、結果はでなければなりませんが

  x  y  z
1 1  0 NA
2 2 10 33

na.omitすべてを含む行を削除しているようNAです。

誰かがこの簡単な質問から私を助けることができますか?

しかし、今私が質問を次のように変更した場合:

DF <- data.frame(x = c(1, 2, 3,NA), y = c(1,0, 10, NA), z=c(43,NA, 33, NA))

x=naor だけを省略したい場合z=naは、|in関数をどこに配置できますか?

回答:


79

complete.cases関数を使用して、関数に次のように入れることができます。

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))

completeFun <- function(data, desiredCols) {
  completeVec <- complete.cases(data[, desiredCols])
  return(data[completeVec, ])
}

completeFun(DF, "y")
#   x  y  z
# 1 1  0 NA
# 2 2 10 33

completeFun(DF, c("y", "z"))
#   x  y  z
# 2 2 10 33

編集: sのない行のみを返しますNA

列に少なくとも1つあるすべての行を削除する場合NAは、complete.cases関数をそのまま使用します。

DF[complete.cases(DF), ]
#   x  y  z
# 2 2 10 33

またはcompleteFun、ワークフローに既に組み込まれている場合;)

completeFun(DF, names(DF))

あなたのアプローチを貪欲にできますか?NAがまったくないすべての列を取得します。
レオ・レオポルド・ヘルツ준 영

1
sのないを返すだけNAですか?好きcompleteFun(DF, names(DF))
ベンバーンズ2017

正しい!これは一般的なニーズなので、回答に追加することを検討してください。--mnelの答えをあなたのように拡張することはできないと思います。関数のアプローチは素晴らしいです!
レオ・レオポルド・ヘルツ준 영

1
できた!チップのThx @LéoLéopoldHertz준영
BenBarnes

192

使用する is.na

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))
DF[!is.na(DF$y),]

1
このアプローチをデータセットのすべての列に貪欲にどのように適用しますか?列の値のいずれかがNAの場合はスキップします。したがって、データセットの出力は2列目のみです。
レオ・レオポルド・ヘルツ준 영

2
na.omit任意の列にNAがあるすべての行を貪欲に削除するために使用しますna.omit(DF)
M. Viking

68

ハドリーtidyrはこの素晴らしい機能を持っていますdrop_na

library(tidyr)
DF %>% drop_na(y)
  x  y  z
1 1  0 NA
2 2 10 33

30

「サブセット」を使用

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))
subset(DF, !is.na(y))

9

使用することが可能であるna.omitためにdata.table

na.omit(data, cols = c("x", "z"))

3
cols=引数はで利用可能であるdata.table::na.omitライブラリ。ベースではありませんstats::na.omit
M.バイキング


2

2つの特定の列のいずれかにが含まれて<NA>いる場合は、行を省略します。

DF[!is.na(DF$x)&!is.na(DF$z),]

1

ちょうどこれを試してください:

DF %>% t %>% na.omit %>% t

データフレームを転置し、転置前に「列」であったヌル行を省略してから、転置します。


8
何が起こっているのか少し説明してください。
フォンブランド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.