删除特定列中具有空白值的行

Posted

技术标签:

【中文标题】删除特定列中具有空白值的行【英文标题】:Delete rows with blank values in one particular column 【发布时间】:2012-02-25 23:08:12 【问题描述】:

我正在处理一个大型数据集,其中一些行带有 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 - 是否有类似的命令可以删除空格?

【问题讨论】:

【参考方案1】:
 df[!(is.na(df$start_pc) | df$start_pc==""), ]

【讨论】:

| 是一个或运算符,! 反转。因此,该命令显示所有 not b) NA 或 b) 等于 "" 的行。 这段代码不会删除整行,而不是通过删除空值来合并它们吗? 这也是我发现的工作。我有一个数据集,我想删除列中缺少数据的行。使用我自己的数据框执行此操作并将值分配给新数据框符合我的预期。【参考方案2】:

这是相同的构造 - 只需测试空字符串而不是 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)), ])

免责声明:我没有测试任何代码。如果有语法错误请告诉我

【讨论】:

@richiecotton 感谢您的编辑。 nzchar 是一种测试非零长度的简洁方法,我不知道。 这些解决方案都不适用于我的情况! df&lt;-structure(list(vars = structure(1:5, .Label = c("a", "b", "v", "d", "e", "s", "ds"), class = "factor"), '1' = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), '2' = c(NA, 0.9, NA, NA, NA), '3' = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_)), .Names = c("vars", "1", "2", "3"), row.names = c(NA, 5L), class = "data.frame")【参考方案3】:

使用 dplyr 的优雅解决方案是:

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

【讨论】:

非常优雅的解决方案和简单:)【参考方案4】:

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

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

【讨论】:

欢迎来到 Stack Overflow!虽然这在理论上可以回答问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。【参考方案5】:

一种简单的方法是制作所有空白单元格NA,并且只保留完整的案例。您还可以查找 na.omit 示例。这是一个广泛讨论的话题。

df[df==""]<-NA
df<-df[complete.cases(df),]

【讨论】:

以上是关于删除特定列中具有空白值的行的主要内容,如果未能解决你的问题,请参考以下文章

VBA比较两个列表并删除不同列中具有重复值的行

如何更改我的 sql 查询,以便删除列中具有某些值的行 [重复]

如何使用熊猫从另一个数据框 B 的列中删除包含特定数量值的数据框 A 中的行?

删除具有特定值的行

删除熊猫数据框中具有特定值的行[重复]

python 在Pandas中删除具有特定值的行(Python)