我有一个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 正则表达式中,您需要使用双反斜杠进行转义。所以\
而不是.
如果您只有整数数据,则可以将grep
与invert = 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
来做同样的事情,但它没有value
和invert
参数,因此可能需要更改一些小事情才能使其工作。