我想重新编码一些标识符,从大写到小写。
我不确定这里的问题是什么。
n = c('AFD.434', 'BSD.23', 'F234.FF')
gsub(pattern = '[[:upper:]]', replacement = '[[:lower:]]', n)
[1] "[[:lower:]][[:lower:]][[:lower:]].434" "[[:lower:]][[:lower:]][[:lower:]].23" "[[:lower:]]234.[[:lower:]][[:lower:]]"
有什么建议吗?
答案 0 :(得分:11)
您的gsub调用将每个匹配项替换为文字字符串" [[:lower:]]"。
最简单的解决方案是不使用正则表达式;只需使用tolower()
(已在评论/其他答案中提及)。
使用正则表达式的一种可能方法是使用Perl扩展模式和\L
修饰符转换为小写:
gsub(pattern = '([[:upper:]])', perl = TRUE, replacement = '\\L\\1', n)
这种方法
(...)
来记住"比赛\1
来引用替换字符串中的匹配\L
修饰符将匹配项转换为小写有关详细信息,请参阅gsub
的在线帮助。
答案 1 :(得分:1)
gsub
函数将正则表达式作为第一个参数,将替换字符串作为第二个,不能使用正则表达式中使用的特殊字符/类。他们被视为文字。因此,您尝试使用文字字符串[[:lower:]]
替换每个大写字母(请参阅my demo)。
要将数据框的值设置为小写,必须使用tolower()
(已经指出):
n = c('AFD.434', 'BSD.23', 'F234.FF')
tolower(n)
请参阅demo
输出:
[1] "afd.434" "bsd.23" "f234.ff"
请注意,当我们需要对字符串的特定部分进行大写时,Franks建议使用Perl \L
运算符很方便,但在您的情况下,这似乎是一种不必要的开销。