我想将第一个之后的字符向量中的所有内容大写_
。例如以下向量:
x <- c("NYC_23df", "BOS_3_rb", "mgh_3_3_f")
应该是这样出来的:
"NYC_23DF" "BOS_3_RB" "mgh_3_3_F"
我一直在尝试使用正则表达式,但无法做到这一点。任何建议,将不胜感激。
我想将第一个之后的字符向量中的所有内容大写_
。例如以下向量:
x <- c("NYC_23df", "BOS_3_rb", "mgh_3_3_f")
应该是这样出来的:
"NYC_23DF" "BOS_3_RB" "mgh_3_3_F"
我一直在尝试使用正则表达式,但无法做到这一点。任何建议,将不胜感激。
你非常接近:
gsub("(_.*)","\\U\\1",x,perl=TRUE)
似乎工作。您只需要使用_.*
(下划线后跟零个或多个其他字符) 而不是_*
(零个或多个下划线) ...
把这个分开一点:
_.*
给出一个正则表达式模式,它匹配下划线_
后跟任意数量(包括 0)的附加字符;.
表示“任何字符”并*
表示“前一个元素的零个或多个重复”()
表示它是我们要存储的模式\\1
在替换字符串中说“插入第一个匹配模式的内容”,即匹配的任何内容_.*
\\U
, 和 , 一起perl=TRUE
表示“将后面的内容大写”(大写_
没有效果;如果我们想在(例如)小写 g 之后将所有内容大写,我们需要从存储的模式中排除 g 并包含它在替换模式中gsub("g(.*)","g\\U\\1",x,perl=TRUE)
:)?gsub
有关更多详细信息,请在(以及?regexp
有关正则表达式的一般信息)中搜索“替换”和“大写”
gsubfn
在gsubfn 包中,gsub
除了替换字符串可以是一个函数外,其他类似。在这里,我们匹配 _ 以及之后通过匹配的所有内容toupper
:
> library(gsubfn)
>
> gsubfn("_.*", toupper, x)
[1] "NYC_23DF" "BOS_3_RB" "mgh_3_3_F"
请注意,这种方法涉及一个特别简单的正则表达式。
base::strsplit
x <- c("NYC_23df", "BOS_3_rb", "mgh_3_3_f", "a")
myCap <- function(x) {
out <- sapply(x, function(y) {
temp <- unlist(strsplit(y, "_"))
out <- temp[1]
if (length(temp[-1])) {
out <- paste(temp[1], paste(toupper(temp[-1]),
collapse="_"), sep="_")
}
return(out)
})
out
}
> myCap(x)
NYC_23df BOS_3_rb mgh_3_3_f a
"NYC_23DF" "BOS_3_RB" "mgh_3_3_F" "a"
pkg <- "stringr"
if (!require(pkg, character.only=TRUE)) {
install.packages(pkg)
require(pkg, character.only=TRUE)
}
myCap.2 <- function(x) {
out <- sapply(x, function(y) {
idx <- str_locate(y, "_")
if (!all(is.na(idx[1,]))) {
str_sub(y, idx[,1], nchar(y)) <- toupper(str_sub(y, idx[,1], nchar(y)))
}
return(y)
})
out
}
> myCap.2(x)
NYC_23df BOS_3_rb mgh_3_3_f a
"NYC_23DF" "BOS_3_RB" "mgh_3_3_F" "a"