У меня есть фрейм данных в R со столбцом строк, например. v1 <- c('JaStADmmnIsynDK', 'laUksnDTusainS')

Моя цель - сделать все буквы в каждой строке заглавными, кроме «s», «t» и «y».

В результате должен получиться следующий результат: «JAStADMMNIsyNDK» и «LAUKsNDTUsAINS».

Таким образом, не меняя ни одной из указанных букв: 's', 't' и 'y'.

На данный момент я делаю это, просто имея 25x

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

Но это кажется излишним! Как я могу легко это сделать в R?

2
Thigers 4 Май 2016 в 23:18

3 ответа

Лучший ответ

Пытаться

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

Данные

v1 <- c("JaStADmmnIsynDK", "laUksnDTusainS")
6
akrun 4 Май 2016 в 20:22

Ответ, опубликованный @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"
1
Rohit Das 4 Май 2016 в 20:45

Мы можем напрямую gsub() заменить прописные буквы на каждую применимую строчную букву, используя оператор perl '\ U' в группе захвата '\ 1' (о чем напомнил @Akrun):

v1 <- c("JaStADmmnIsynDK", "laUksnDTusainS")
gsub('([a-ru-xz])', '\\U\\1'), v1, perl = TRUE)
"JAStADMMNIsyNDK" "LAUKsNDTUsAINS"
1
smci 4 Фев 2017 в 04:19