16

最初のの後に続く文字ベクトルのすべてを大文字にしたいと思い_ます。たとえば、次のベクトル:

x <- c("NYC_23df", "BOS_3_rb", "mgh_3_3_f") 

このように出てくるはずです:

"NYC_23DF" "BOS_3_RB" "mgh_3_3_F"

正規表現で遊んでみましたが、できません。任意の提案をいただければ幸いです。

4

3 に答える 3

25

あなたはとても近かった:

gsub("(_.*)","\\U\\1",x,perl=TRUE)

うまくいくようです。(ゼロ以上のアンダースコア)_.*ではなく、(アンダースコアの後にゼロ以上の他の文字が続く)を使用する必要がありました..._*

これをもう少し分解するには:

  • _.*_アンダースコアとそれに続く任意の数(0を含む)の追加文字に一致する正規表現パターンを提供します。.「任意の文字」を*示し、「前の要素の0回以上の繰り返し」を示します
  • この正規表現を括弧で囲む()ことは、それが保存したいパターンであることを示します
  • \\1置換文字列には、「最初に一致したパターンの内容を挿入する」、つまり一致したものは何でも_.*
  • \\Uは、と組み合わせてperl=TRUE、「後に続くものを大文字にする」と言います(大文字_は効果がありません。たとえば、小文字のgの後にすべてを大文字にしたい場合は、格納されているパターンからgを除外して含める必要があります。置換パターンでgsub("g(.*)","g\\U\\1",x,perl=TRUE):)

詳細については、で「置換」および「大文字化」を検索してください?gsub(および?regexp正規表現に関する一般情報を検索してください) 。

于 2012-05-29T08:58:23.847 に答える
12

gsubfngsubfnパッケージのは、gsub置換文字列が関数になることを除いては似ています。ここで_を照合し、その後すべてを照合しますtoupper

> library(gsubfn)
>
> gsubfn("_.*", toupper, x)
[1] "NYC_23DF"  "BOS_3_RB"  "mgh_3_3_F"

このアプローチには、特に単純な正規表現が含まれることに注意してください。

于 2012-05-29T09:18:10.110 に答える
4

を使用した簡単な例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" 
于 2012-05-29T08:33:32.153 に答える