web-dev-qa-db-ja.com

1つの特定の列に空白の値がある行を削除する

私は大きなデータセットに取り組んでおり、いくつかの行にはNAがあり、他の行には空白があります:

df <- data.frame(ID = c(1:7),                                   
         home_pc = c("","CB4 2DT", "NE5 7TH", "BY5 8IB", "DH4 6PB","MP9 7GH","KN4 5GH"),               
         start_pc = c(NA,"Home", "FC5 7YH","Home", "CB3 5TH", "BV6 5PB",NA),               
         end_pc = c(NA,"CB5 4FG","Home","","Home","",NA))

(start_pc列とend_pc列で)NAとブランクを一度に削除するにはどうすればよいですか?私は過去に使用しました:

df<- df[-which(is.na(df$start_pc)), ]

... NAを削除するには-空白を削除する同様のコマンドがありますか?

51
KT_1
 df[!(is.na(df$start_pc) | df$start_pc==""), ]
70
sgibb

これは同じ構成です-NAではなく空の文字列をテストします。

これを試して:

df <- df[-which(df$start_pc == ""), ]

実際、コードを見ると、whichは必要ありませんが、代わりに否定を使用するため、次のように単純化できます。

df <- df[!(df$start_pc == ""), ]
df <- df[!is.na(df$start_pc), ]

そして、もちろん、次のようにこれら2つのステートメントを組み合わせることができます。

df <- df[!(df$start_pc == "" | is.na(df$start_pc)), ]

withを使用してさらに簡素化します。

df <- with(df, df[!(start_pc == "" | is.na(start_pc)), ])

nzcharを使用して、ゼロ以外の文字列の長さをテストすることもできます。

df <- with(df, df[!(nzchar(start_pc) | is.na(start_pc)), ])

免責事項:このコードはテストしていません。構文エラーがどこかにあるかどうかを教えてください

23
Andrie

簡単なアプローチは、すべての空白セルをNAにして、完全なケースのみを保持することです。 na.omitの例を探すこともできます。これは広く議論されているトピックです。

df [df == ""] <-NA

df <-df [complete.cases(df)、]

4
user6074085

別の解決策は、1つの変数に空白がある行を削除することです。

df <- subset(df, VAR != "")
2
user6164045

Dplyrを使用したエレガントなソリューションは次のとおりです。

df %>%
  # recode empty strings "" by NAs
  na_if("") %>%
  # remove NAs
  na.omit
1
Agile Bean