最初のの後に続く文字ベクトルのすべてを大文字にしたいと思い_
ます。たとえば、次のベクトル:
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を含む)の追加文字に一致する正規表現パターンを提供します。.
「任意の文字」を*
示し、「前の要素の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"