【问题标题】:String substitutions across multiple columns in tidyversetidyverse 中跨多个列的字符串替换
【发布时间】:2021-01-01 07:28:42
【问题描述】:

我的数据框

>df <- data.frame(Names = c("A", "B", "C"), Total = c("125", "2 500", "1 350"), 
>           Boys = c("50", "1 500", "350"),
>           Girls = c("75", "1 000", "1 000")) 
  Names Total  Boys Girls
1     A   125    50    75
2     B 2 500 1 500 1 000
3     C 1 350   350 1 000

所有值都是字符串。我想在 Total, Boys and Girls 中将空格“”替换为非空格“”。我知道

df %>%
  mutate(Total = gsub(" ", "", Total),
         Boys = gsub(" ", "", Boys),
         Girls = gsub(" ", "", Girls))

但是有没有(tidyverse 风格)更普遍的方式来做到这一点?类似的东西

df %>% # (This don't work)
  mutate(across(c(Total, Boys, Girls), gsub(" ", "", .x)))

即我正在寻找一种可以很好地扩展的解决方案。

提前致谢。

【问题讨论】:

    标签: r dplyr tidyverse stringr


    【解决方案1】:

    你可以使用:

    library(dplyr)
    
    df %>% mutate(across(c(Total, Boys, Girls), ~as.numeric(gsub(" ", "", .))))
    
    #  Names Total Boys Girls
    #1     A   125   50    75
    #2     B  2500 1500  1000
    #3     C  1350  350  1000
    

    或者在基础 R 中使用 lapply

    df[-1] <- lapply(df[-1], function(x) as.numeric(gsub(" ", "", x)))
    

    【讨论】:

      【解决方案2】:

      我们可以从stringr使用str_remove

      library(stringr)
      library(dplyr)
      df %>% 
          mutate(across(-Names, ~ as.numeric(str_remove(., "\\s+"))))
      #  Names Total Boys Girls
      #1     A   125   50    75
      #2     B  2500 1500  1000
      #3     C  1350  350  1000
      

      【讨论】:

        【解决方案3】:

        也许你可以试试gsub + as.matrix 如下所示

        type.convert(cbind(df[1], gsub("\\s+", "", as.matrix(df[-1]))), as.is = TRUE)
        

        给了

          Names Total Boys Girls
        1     A   125   50    75
        2     B  2500 1500  1000
        3     C  1350  350  1000
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-01-27
          • 2021-03-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-10
          • 1970-01-01
          相关资源
          最近更新 更多