R:正则表达式,用于从数字的字符向量中提取非数字条目



我有一个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或带引号将正则表达式定义为字符串。 用^$包裹正则表达式的中心部分,而不是<>将所有"

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

Error: unexpected (and then)
"^
  • "(如果以"^"开头)
  • "\">
  • (如果以"\"开头)
  • "<"(如果以"<"开头)
  • '\d' 如果用引号括起来而不是使用 作为角色

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

任何帮助都感激地收到和承认。

首先,as.character(<d*[a-zA-Z][a-zA-Z0-9]*>)不正确,不起作用。例如,as.character(A)不会给你"A",而是给出一个错误。您应该用引号将模式括起来。

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

如果您只有整数数据,则可以将grepinvert = TRUE一起使用,value = 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参数,因此可能需要更改一些小事情才能使其工作。

最新更新