web-dev-qa-db-ja.com

NAの特定の列を含む行を省略します

データフレームでNA値を省略する方法を知りたいのですが、興味のある一部の列でのみです。

例えば、

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

しかし、yNAであるデータのみを省略したいので、結果は

  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=naまたはz=naのみを省略したい場合、|を関数のどこに置けばよいですか?

100
user1489975

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

編集:NAsのない行のみを返す

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

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

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

completeFun(DF, names(DF))
64
BenBarnes

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),]
163
mnel

ハドリーのtidyrはこの素晴らしい関数drop_naを取得しました

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

「サブセット」を使用

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

今では、単に使用することが可能です:

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

これを試して:

cc=is.na(DF$y)
m=which(cc==c("TRUE"))
DF=DF[-m,]
3
rockswap

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

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

これを試してください:

DF %>% t %>% na.omit %>% t
0
Leon Qi