【问题标题】:Convert lowercase to uppercase in a mixed dataframe (character, vector, integer) while preserving data types in R?在混合数据帧(字符、向量、整数)中将小写转换为大写,同时保留 R 中的数据类型?
【发布时间】:2020-12-06 03:42:31
【问题描述】:

我有一个包含字符、整数和因子的混合数据框,我想将它们转换为大写。这是一个经常发布的问题(例如here),但我无法在不转换数据类型的情况下将字符和因子更改为大写。下面的工作示例:


# create a three column dataframe with characters, integers and factors:

df <- data.frame(v1=letters[1:5],v2=1:5,v3=as.factor(letters[10:14]),stringsAsFactors=FALSE)

  v1 v2 v3
1  a  1  j
2  b  2  k
3  c  3  l
4  d  4  m
5  e  5  n

glimpse(df)

# v1 <chr> "a", "b", "c", "d", "e"
# v2 <int> 1, 2, 3, 4, 5
# v3 <fct> j, k, l, m, n

mutate_all 和 toupper 变为大写,但将因子转换为字符:

df <- mutate_all(df, funs(toupper))
glimpse(df)

# v1 <chr> "A", "B", "C", "D", "E"
# v2 <chr> "1", "2", "3", "4", "5"
# v3 <chr> "J", "K", "L", "M", "N"

mutate_if 和 str_to_upper 适用于 is.character 但不适用于因子:

df <- df %>% mutate_if(is.character, str_to_upper)
glimpse(df)

# v1 <chr> "A", "B", "C", "D", "E"
# v2 <int> 1, 2, 3, 4, 5
# v3 <fct> j, k, l, m, n

mutate_if 和 str_to_upper 适用于 is.factor 但将因子转换为字符:

df <- df %>% mutate_if(is.character, str_to_upper)
df <- df %>% mutate_if(is.factor, str_to_upper)
glimpse(df)

# v1 <chr> "A", "B", "C", "D", "E"
# v2 <int> 1, 2, 3, 4, 5
# v3 <chr> "J", "K", "L", "M", "N"

理想情况下,我想找到一个保留数据类型并且可以应用于任何数据帧的一揽子解决方案。

【问题讨论】:

    标签: r dataframe tidyverse


    【解决方案1】:

    要在晶鑫的回复基础上解决 Thomas Moore 的后续问题,您可以将列名更改为 upper 并添加以下内容:

    df %>% 
      mutate(across(where(is.character), str_to_upper),
             across(where(is.factor), ~ factor(str_to_upper(.x)))) %>%
      rename_with(str_to_upper)
    

    【讨论】:

      【解决方案2】:
      df %>% 
        mutate(across(where(is.character), str_to_upper),
               across(where(is.factor), ~ factor(str_to_upper(.x))))
      

      【讨论】:

      • 完美,感谢晶鑫!现在......有没有一种方法可以将更改列名包含在其中作为一个单一的 tidyverse 解决方案?例如toupper(colnames(df)) ?
      【解决方案3】:

      toupperstr_to_upper 将类更改为字符。你有两个选择:

      1. 转换回factor
      df <- df %>% mutate_if(is.character, str_to_upper)
      df <- df %>% mutate_if(is.factor, ~factor(str_to_upper(.)))
      str(df)
      
      #'data.frame':  5 obs. of  3 variables:
      # $ v1: chr  "a" "b" "c" "d" ...
      # $ v2: int  1 2 3 4 5
      # $ v3: Factor w/ 5 levels "J","K","L","M",..: 1 2 3 4 5
      
      1. 更改因子变量的levels。将上述第 1 步和第 2 步合并为 1。
      df <- df %>% mutate_if(~is.character(.) || is.factor(.), 
                  ~if(is.factor(.)) {levels(.) <- toupper(levels(.));.} else toupper(.))
      

      请注意,_if_at_all 动词已在 dplyr 1.0.0 中弃用,取而代之的是 across

      【讨论】:

        猜你喜欢
        • 2014-12-11
        • 1970-01-01
        • 2019-06-20
        • 2017-01-23
        • 2023-01-18
        • 2016-06-06
        • 2021-05-10
        • 2011-05-27
        • 1970-01-01
        相关资源
        最近更新 更多