【问题标题】:R: regex for extracting non-numeric entries from a character vector of numbersR:用于从数字字符向量中提取非数字条目的正则表达式
【发布时间】:2022-01-26 04:06:52
【问题描述】:

我有一个 data.frame,其中一列数字数据被 readr 作为字符读取,至少部分是因为某些值是“N/A”。我不知道这些值是否真的包含引号。

我正在尝试提取该列中包含纯数字以外的内容的所有值,即包含非数字 1-9 的任何字符。我的目的是了解其中有多少,并查看除了“N/A”之外是否还有其他格式,以准备用其他格式替换它们,然后将向量转换为数字。

虽然我相信有更聪明的方法可以做到这一点,但我正在尝试使用从使用 R 的 grepl 命令应用于向量的正则表达式创建的逻辑向量来提取这些值。

A2 <- 1:10
A3 <- sample(1000:9999, 10)

dat_df <- data.frame(A2, A3)
str(dat_df)
dat_df$A3[1:3]<- c("N/A", "", "banana")

dat_df 是一个简化的数据集,提供了可重复性。

这是一个例子

dat_df$A3[grepl(as.character(\<\d*[a-zA-Z][a-zA-Z0-9]*>\), x = dat_df$A3)]

这个特定的给出了错误

Error: unexpected '<' in dat_df"$A3[grepl(as.character(\<"

我已经尝试了很多这样的变种。这些包括: 将初始数据包装在 ( ) 中(以防出现优先级问题)。 使用帮助文件推荐的as.character 或带引号将正则表达式定义为字符串。 用^$ 代替\&lt;&gt;\ 包裹正则表达式的中心部分 将所有“\”s 加倍

在每种情况下,我都会得到上面显示的语法错误的一些变体,随版本而变化。

Error: unexpected (and then)
  • '^' 如果它以'^'开头
  • '\' 如果它以'\'开头
  • ' 开头
  • '\d' 如果用引号括起来而不是使用 as.character

我无法从这种错误模式中找出正面或反面。

感激地接受和承认任何帮助。

【问题讨论】:

    标签: r regex subset data-extraction grepl


    【解决方案1】:

    首先,as.character(\&lt;\d*[a-zA-Z][a-zA-Z0-9]*&gt;\) 不正确且不起作用。例如,as.character(A) 不会给您“A”,但会给出错误。您应该用引号将模式括起来。

    其次,在 R 正则表达式中,您需要使用双反斜杠进行转义。所以\\ 而不是\

    如果您只有整数数据,您可以使用 grepinvert = TRUEvalue = TRUE 来获取不是数字的值。

    grep('^\\d+$', dat_df$A3, invert = TRUE, value = TRUE)
    #[1] "N/A"    ""       "banana"
    

    要将这些值更改为 NA 并将它们转换为数字,您可以这样做 -

    dat_df$A3[grep('^\\d+$', dat_df$A3, invert = TRUE)] <- NA
    dat_df$A3 <- as.numeric(dat_df$A3)
    dat_df
    
    #   A2   A3
    #1   1   NA
    #2   2   NA
    #3   3   NA
    #4   4 7475
    #5   5 1162
    #6   6 9828
    #7   7 6359
    #8   8 7823
    #9   9 2544
    #10 10 5287
    

    如果您更喜欢 grep,也可以使用 grepl 来做同样的事情,但它没有 valueinvert 参数,因此可能需要更改一些小东西才能使其正常工作。

    【讨论】:

      猜你喜欢
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多