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

当然,您可以将这两个语句组合如下:

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

另一种解决方案是删除一个变量中带有空格的行:

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 回答