R中正则表达式的匹配
假设我有下一个数据帧R中正则表达式的匹配,r,regex,R,Regex,假设我有下一个数据帧 table<-data.frame(col1=c("4-p","4-p 1.0","2-p","4-p 1.6","2-p 1.0"),col2=c("4-p 1.0","2-p 1.0","1.6 2-p","4-p 1.8","1.0 2-p civic"), p_ok=c("Y","N","Y","Y","Y"), n_ok=c("N","Y","N","N","Y")) col1 col2 p_ok n_ok 4-p
table<-data.frame(col1=c("4-p","4-p 1.0","2-p","4-p 1.6","2-p 1.0"),col2=c("4-p 1.0","2-p 1.0","1.6 2-p","4-p 1.8","1.0 2-p civic"), p_ok=c("Y","N","Y","Y","Y"), n_ok=c("N","Y","N","N","Y"))
col1 col2 p_ok n_ok
4-p 4-p 1.0 Y N
4-p 1.0 2-p 1.0 N Y
2-p 1.6 2-p Y N
4-p 1.6 4-p 1.8 Y N
2-p 1.0 1.0 2-p civic Y Y
table我们可以通过使用sub
切换“p”子字符串和数字的顺序,然后对于没有数字的元素,将其替换为0,使用strsplit
将字符串一分为二,并通过比较矩阵的列表
将其减少为逻辑矩阵
。如果需要,我们可以用Y/N
res <- Reduce(`==`, lapply(table[1:2], function(x) do.call(rbind,
strsplit(sub("^([A-z0-9-]+)\\b$", "\\1 0",
sub("^([0-9.]+)\\s+([0-9]+-p).*", "\\2 \\1", x)), " "))))
ifelse(res, "Y", "N")
# [,1] [,2]
#[1,] "Y" "N"
#[2,] "N" "Y"
#[3,] "Y" "N"
#[4,] "Y" "N"
#[5,] "Y" "Y"
res Yes,部分是可以的,但请注意no列的分布方式始终相同,例如,第5行(n_ok是'Y'),而不是'n',因为de 1.0位于字符串的开头对不起,我更正了这个问题。