Прописная буква первого символа в строке в R - PullRequest
0 голосов
/ 12 октября 2019

Я хочу использовать заглавные буквы имени и фамилии во фрейме данных.
В частности, используйте заглавные буквы в имени и фамилии и декапитализируйте остальные символы в имени. Однако функция, которую я пишу, не дает ожидаемого результата.

# Create a data frame of First Names
First.Name <- c("John", "MARY", "tommy", "DI", "leonardo")
firstname_df <- data.frame(FirstName)

# Write a function to format the names in a list
CapStr <- function(y) {
  for (i in 1:length(y)) {
    c <- strsplit(y[i], " ")[[1]]
    paste(toupper(substring(c, 1, 1)), tolower(substring(c, 2)), sep = "")
  }
}

# Call the function 
CapStr(First.Name)
# Show results
First.Name

Ответы [ 3 ]

2 голосов
/ 12 октября 2019
foo = function(x){
    paste(toupper(substring(x, 1, 1)),
          tolower(substring(x, 2, nchar(x))),
          sep = "")
}

foo(First.Name)
#[1] "John"     "Mary"     "Tommy"    "Di"       "Leonardo"

Или используйте regex

gsub("(\\D)(\\D+)", "\\U\\1\\L\\2", First.Name, perl = TRUE)
#[1] "John"     "Mary"     "Tommy"    "Di"       "Leonardo"
1 голос
/ 12 октября 2019
tools::toTitleCase(tolower(First.Name))
1 голос
/ 12 октября 2019

Похоже, вы пытаетесь работать с функцией .simpleCap, описанной в документации для ?tolower:

.simpleCap <- function(x) {
    s <- strsplit(x, " ")[[1]]
    paste(toupper(substring(s, 1, 1)), substring(s, 2),
          sep = "", collapse = " ")
}

, которую можно использовать для преобразования в верхний регистр первой буквы каждогослово в одной строке. Вы добавили for цикл и tolower в оставшуюся часть слова. Лучшим вариантом может быть сохранение tolower, но удаление цикла for и использование вместо него sapply:

CapStr <- function(y) {
    c <- strsplit(y, " ")[[1]]
    paste(toupper(substring(c, 1, 1)), tolower(substring(c, 2)), sep = "")
}

> sapply(First.Name,CapStr,USE.NAMES = F)
[1] "John"     "Mary"     "Tommy"    "Di"       "Leonardo"

Другой вариант - использование stringr::str_to_title:

library(stringr)
> str_to_title(First.Name)
[1] "John"     "Mary"     "Tommy"    "Di"       "Leonardo"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...