如何将R中除某些字母外的所有字母大写

How to capitalize all but some letters in R

我在 R 中有一个带有一列字符串的数据框,例如v1 <- c('JaStADmmnIsynDK', 'laUksnDTusainS')

我的目标是将每个字符串中除 's'、't' 和 'y' 之外的所有字母都大写。

所以结果应该是:'JAStADMMNIsyNDK' 和 'LAUKsNDTUsAINS'。

因此不更改任何上述字母:'s'、't' 和 'y'。

截至目前,我只需拥有 25x

levels(df$strings) <- sub('n', 'N', levels(df$strings))

但这似乎有点过分了!我怎样才能在 R 中轻松做到这一点?

尝试

v2 <- gsub("[sty]", "", paste(letters, collapse="")) 
chartr(v2, toupper(v2), v1)
#[1] "JAStADMMNIsyNDK" "LAUKsNDTUsAINS" 

数据

v1 <- c("JaStADmmnIsynDK", "laUksnDTusainS")

@akrun 的回答真是太棒了。但这是我更直接的蛮力方法,我完成得太晚了。

s <- "JaStADmmnIsynDK"

customUpperCase <- function(s,ignore = c("s","t","y")) {
  u <- sapply(unlist(strsplit(s,split = "")),
              function(x) if(!(x %in% ignore)) toupper(x) else x )
  paste(u,collapse = "")
}

customUpperCase(s)
#[1] "JAStADMMNIsyNDK"

我们可以直接 gsub() 在每个适用的小写字母上使用大写替换,在 '\1' 捕获组上使用 perl '\U' 运算符(@Akrun 提醒):

v1 <- c("JaStADmmnIsynDK", "laUksnDTusainS")
gsub('([a-ru-xz])', '\U\1'), v1, perl = TRUE)
"JAStADMMNIsyNDK" "LAUKsNDTUsAINS"