70

私は大規模なデータセットに取り組んでおり、一部の行には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))

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

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

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

4

5 に答える 5

100
 df[!(is.na(df$start_pc) | df$start_pc==""), ]
于 2012-02-03T10:18:53.167 に答える
28

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

免責事項:私はこのコードのいずれもテストしていません。どこかに構文エラーがある場合はお知らせください

于 2012-02-03T10:19:02.427 に答える
16

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

df %>%
  # recode empty strings "" by NAs
  na_if("") %>%
  # remove NAs
  na.omit
于 2019-08-13T09:57:39.447 に答える
7

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

df <- subset(df, VAR != "")
于 2016-04-06T00:27:55.817 に答える
5

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

df[df==""]<-NA
df<-df[complete.cases(df),]
于 2016-03-16T22:18:40.437 に答える