【问题标题】:Capitalize with dplyr用 dplyr 大写
【发布时间】:2016-05-11 09:39:45
【问题描述】:

我正在使用 dplyr 进行数据清理。 我想做的一件事是将某些列中的值大写。

    data$surname
    john
    Mary
    John
    mary
    ...

我想我必须将 dplyr 的 mutate 功能与类似的东西一起使用

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

但是如何将两者结合起来呢?我收到各种错误或截断的数据帧

谢谢

【问题讨论】:

    标签: r dplyr capitalize


    【解决方案1】:

    我们可以使用sub

    sub("(.)", "\\U\\1", data$surname, perl=TRUE)
    #[1] "John" "Mary" "John" "Mary"
    

    dplyr 工作流中实现

    library(dplyr)
    data %>%
         mutate(surname = sub("(.)", "\\U\\1", surname, perl=TRUE))
    

    如果我们需要在多个列上执行此操作

    data %>%
         mutate_each(funs(sub("(.)", "\\U\\1", ., perl=TRUE)))
    

    只是为了检查

    res <- data1 %>%  
              mutate(surname = sub("(.)", "\\U\\1", surname, perl=TRUE))
    sum(grepl("[A-Z]", substr(res$surname, 1,1)))
    #[1] 500000
    

    数据

    data <- data.frame(surname=c("john", "Mary", "John", "mary"), 
    firstname = c("abe", "Jacob", "george", "jen"), stringsAsFactors=FALSE)
    
    data1 <-  data.frame(surname = sample(c("john", "Mary", "John", "mary"), 
        500000, replace=TRUE), stringsAsFactors=FALSE)
    

    【讨论】:

    • 感谢 Akrun,它适用于大小合理的数据框,我已经检查过了。但在我的 500000 行数据框中没有任何效果,也没有显示错误。
    • @PhilippeRamirez 这很奇怪。您更改了多少列?
    • 一次一个,使用你的第一个 dplyr 函数
    • @PhilippeRamirez 我无法重现该问题。请检查更新
    • 好的,pb 将与可视化一起使用。在小桌子上应用该功能将向我显示正确大小写的完整结果(在 RStudio 上)。但是 head(data) 将返回原始拼写。与 write.csv 类似。我应该怎么做才能很好地捕捉结果?
    【解决方案2】:

    有一个专门的功能可以试试:

    R.utils::capitalize(data$surname)
    

    如果这需要在dplyr 过程中实现,可以尝试以下方法:

    library(dplyr)
    library(R.utils)
    data %>% mutate(surname = capitalize(surname))
    

    【讨论】:

    • 感谢 RHertel。您的解决方案似乎也有效。我的 pb 是我无法获得最终产品。正如我在上面对 Akrun 的回应,在一张小桌子上应用该函数将向我显示具有正确大小写的完整结果(在 RStudio 上)。但是 head(data) 将返回原始拼写。与 write.csv 类似。我应该怎么做才能很好地捕捉结果?
    • 我找到了一种方法:将结果分配给一个新表。谢谢
    【解决方案3】:

    聚会有点晚了,但你可以使用stringr

    library(stringr)
    library(dplyr)
    
    example1 <- tibble(names = c("john" ,"Mary", "John", "mary"))
    
    example1 %>%
    mutate(names = str_to_title(names))
    
    ##  names
    ##  <chr>
    ## 1 John 
    ## 2 Mary 
    ## 3 John 
    ## 4 Mary    
    

    如果您希望所有术语都大写,这仍然有效

    example2 <- tibble(names = c("john james" ,"Mary carey", "John Jack", "mary Harry"))
    
    example2 %>%
    mutate(names = str_to_title(names))
    
    ##  names
    ##  <chr>
    ## 1 John James 
    ## 2 Mary Carey 
    ## 3 John Jack
    ## 4 Mary Harry    
    

    如果您只想将第一个术语大写,str_to_sentence() 将起作用

    example2 %>%
    mutate(names = str_to_sentence(names))
    
    ##  names
    ##  <chr>
    ## 1 John james 
    ## 2 Mary carey 
    ## 3 John jack
    ## 4 Mary harry    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多