微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

`stringr` 仅将数据框中的第一个字母转换为大写

如何解决`stringr` 仅将数据框中的第一个字母转换为大写

我想将列中每个单词的第一个字母大写,而不将剩余的字母转换为小写。我正在尝试使用 stringr,因为它是矢量化的并且可以很好地处理数据帧,但也会使用另一种解决方案。下面是一个 reprex,显示了我想要的输出和各种尝试。我只能选择第一个字母,但不确定如何将其大写。感谢您的帮助!

我还查看了相关帖子,但不确定如何在我的案例中应用这些解决方案(即在数据框中):

First letter to upper case

Capitalize the first letter of both words in a two word string

library(dplyr)
library(stringr)

words <-
  tribble(
    ~word,~number,"problems",99,"Answer",42,"golden ratio",1.61,"nothing",0
  )

# Desired output
new_words <-
  tribble(
    ~word,"Problems","Golden Ratio",0
  )

# Converts first letter of each word to upper and all other to lower
mutate(words,word = str_to_title(word))
#> # A tibble: 4 x 2
#>   word         number
#>   <chr>         <dbl>
#> 1 Problems      99   
#> 2 Answer        42   
#> 3 Golden Ratio   1.61
#> 4 nothing        0

# Some attempts
mutate(words,word = str_replace_all(word,"(?<=^|\\s)([a-zA-Z])","X"))
#> # A tibble: 4 x 2
#>   word         number
#>   <chr>         <dbl>
#> 1 Xroblems      99   
#> 2 Xnswer        42   
#> 3 Xolden Xatio   1.61
#> 4 XOTHING        0
mutate(words,"\\1"))
#> # A tibble: 4 x 2
#>   word         number
#>   <chr>         <dbl>
#> 1 problems      99   
#> 2 Answer        42   
#> 3 golden ratio   1.61
#> 4 nothing        0

reprex package (v2.0.0) 于 2021 年 12 月 13 日创建

解决方法

这是使用 gsub 的基本 R 解决方案:

words$word <- gsub("\\b([a-z])","\\U\\1",words$word,perl=TRUE)

这会将每个单词的第一个小写字母替换为其大写版本。请注意,\b 单词边界将匹配前面有空格或列值开头的小写字母。

,

根据 https://community.rstudio.com/t/is-there-will-there-be-perl-support-in-stringr/38016/3 stringr 使用 stringi 和 ICU 引擎,因此它不支持也不会支持 perl 类型的正则表达式(这是在其他答案中启用 \U\1 部分的原因)。因此,您应该使用 @Tim 的带有 perl=TRUE 答案的 gsub。

,

我们可以使用 str_to_title 包中的 stringr 函数。

问题是 NOTHING 变成了 Nothing

但是我们可以通过 ifelse -> 检查第一个字符是否为大写然后叶子是否为大写来克服这个问题。

library(dplyr)
library(stringr)
words %>% 
    mutate(word = ifelse(str_detect(word,"^[:upper:]+$"),word,str_to_title(word)))

输出:

  word         number
  <chr>         <dbl>
1 Problems      99   
2 Answer        42   
3 Golden Ratio   1.61
4 NOTHING        0 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。