【问题标题】:Grep include NA values in resultsGrep 在结果中包含 NA 值
【发布时间】:2019-04-27 18:26:07
【问题描述】:

我正在尝试使用 grep 过滤我的数据,但也在结果中包含 NA,目前由于它们与 grep 表达式不匹配而被删除。

platform        x86_64-w64-mingw32
version.string  R version 3.5.3 (2019-03-11)

样本数据

   value expected_result actual_result
1  10001            Pass          Pass             
2      0            Pass          Pass
3      6            Pass          Pass
4  20004            Pass          Pass
5     NA            Pass          Fail
6   4829            Fail          Fail
7    521            Fail          Fail
8     89            Fail          Fail
9  40012            Fail          Fail
10 47321            Fail          Fail

代码

df <- df[grep("(\\b\\d{1}\\b)|([0-9]{1}[0]{3}[0-9]{1})", df$value),]

逻辑规则

1) 该值将包含 0 到 5 个数字字符。

2) 应该保留的三个值是:

a) 一位数据。 (示例值 2 和 3)

b) 无数据或 NA(示例值 5)

c) 五位数据,但中间三位必须全部为零。 (示例值 1 和 4)

【问题讨论】:

  • 试试df[grepl("(\\b\\d{1}\\b)|([0-9]{1}[0]{3}[0-9]{1})", df$value)|is.na(df$value),]

标签: r


【解决方案1】:

要包含NA 行,请使用is.na 创建第二个条件,并在grepl 上使用| (OR) 将它们连接起来

df[grepl("(\\b\\d{1}\\b)|([0-9]{1}[0]{3}[0-9]{1})", df$value)|is.na(df$value),]
#   value expected_result actual_result
#1 10001            Pass          Pass
#2     0            Pass          Pass
#3     6            Pass          Pass
#4 20004            Pass          Pass
#5    NA            Pass          Fail

或者让它更紧凑一些

grepl("^\\d$|^([1-9]0{3}[1-9]$)", df$value)|is.na(df$value)

数据

df <- structure(list(value = c(10001L, 0L, 6L, 20004L, NA, 4829L, 521L, 
89L, 40012L, 47321L), expected_result = c("Pass", "Pass", "Pass", 
"Pass", "Pass", "Fail", "Fail", "Fail", "Fail", "Fail"), actual_result = c("Pass", 
"Pass", "Pass", "Pass", "Fail", "Fail", "Fail", "Fail", "Fail", 
"Fail")), class = "data.frame", row.names = c("1", "2", "3", 
"4", "5", "6", "7", "8", "9", "10"))

【讨论】:

  • 感谢您的快速回答。不幸的是,当我运行更新的命令时,我给出了以下错误Warning message: In grep("(\\b\\d{1}\\b)|([0-9]{1}[0]{3}[0-9]{1})", df$value) | : longer object length is not a multiple of shorter object length。在没有|is.na(df$value) 的情况下运行时不会发生这种情况。你有什么想法吗?
  • @Kickball 看起来您使用的是grep 而不是greplgrep 只返回匹配行的数字索引,而grepl 返回整列的逻辑向量。如果您检查我的解决方案,我使用 grepl 而不是 grep
  • 谢谢,我更新了我的代码以使用grepl,它成功了。很抱歉我错过了。
猜你喜欢
  • 2012-10-06
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多