我的字符列的值为"CHELSEAFC17FEB640CE"
,"BARCAFC17FEB1400CE"
。我想提取字符"CHELSEAFC"
,"BARCAFC"
等等。目前我正在使用
regmatches(x$symbol,regexpr("[A-z]+",x$symbol))
但得到一个错误:
$<-.data.frame
(*tmp*
,“cg”,值= c(“CHELSEAFC”, “CHELSEAFC”,“TOTTENHAMFC”,:替换有11366767行,数据 有11366772电话:$&lt; - - &gt; $&lt; - .data.frame执行暂停
我似乎无法找到问题行。请有人帮忙调试或建议更好的方法:)
答案 0 :(得分:1)
假设我们需要提取非数字部分,一个选项是通过匹配一个或多个数字([0-9]+
)后跟其他字符(.*
)来删除其他字符并替换它与""
sub("[0-9]+.*", "", str1)
#[1] "CHELSEAFC" "BARCAFC"
或者从字符串的开头(([A-Z]+)
)将大写字母作为一组(^
)捕获,并将其替换为该组的反向引用(\\1
)
sub("^([A-Z]+).*", "\\1", str1)
#[1] "CHELSEAFC" "BARCAFC"
str1 <- c( "CHELSEAFC17FEB640CE", "BARCAFC17FEB1400CE")
答案 1 :(得分:1)
而不是[A-z]+
您应该使用^[A-Za-z]+
检查一下,以便更好地了解您为什么不应该这样做:https://stackoverflow.com/a/29771926/4082217
答案 2 :(得分:0)
出现错误是因为输入向量中有一些不包含字母的值(以及一些symbols that [A-z]
matches)。这使得regmatches
在没有匹配的情况下不返回任何值,因此,由于匹配数与数据框中的行数不一致,因此无法分配列值。
您可能会做的是:
1)使用sub
x <- c("------", "CHELSEAFC17FEB640CE", "BARCAFC17FEB1400CE")
> sub("^([a-zA-Z]+).*|.*", "\\1", df$x)
[1] "" "CHELSEAFC" "BARCAFC"
>
x$symbol <- sub("^([a-zA-Z]+).*|.*", "\\1", x$symbol)
^([a-zA-Z]+).*|.*
模式将匹配并捕获一个或多个ASCII字母(将[a-zA-Z]+
替换为[[:alpha:]]+
以匹配ASCII以外的字母)在字符串的开头({{ 1}}),^
将匹配字符串的其余部分,OR(.*
)整个字符串将与第二个分支匹配,匹配将被捕获组内容替换(所以,它将填充字母值或将为空。)
2)如果您想为不匹配的值保留NA,请使用 stringr |
:
str_extract
请注意,library(stringr)
> x$symbol <- str_extract(x$symbol, "^[A-Za-z]+")
## => 1 <NA>
## 2 CHELSEAFC
## 3 BARCAFC
仅匹配字符串开头的1 + ASCII字母(^[A-Za-z]+
)([A-Za-z]+
)。