【问题标题】:Change case of multiple factor variable values in dataframe更改数据框中多个因子变量值的大小写
【发布时间】:2017-05-29 06:30:19
【问题描述】:

我有一个包含整数和因子变量的数据框。我们称之为df。它有变量"a", "b", "c", "d""a" "c" 是因素。

由于大小写(例如,alameda 和“ALAMEDA”),一些因子变量的值被视为彼此唯一的值。我的目标是将所有因子变量的所有值更改为小写。我看到了以下答案,它提供了更改一列的解决方案: Lower case for a data frame column。 我尝试修改该答案以使用数据框中的所有因子变量,但无济于事。看来我的目标可以通过dplyr::mutate_if()is.factortolower(levels()) 来实现,但我不确定这一切是如何结合在一起的。我认为我最接近的尝试是df %>% mutate_if(is.factor, tolower(levels())),但显然这不起作用。如果有办法做到这一点,修改上面链接的答案也很好!

【问题讨论】:

  • 感谢您到目前为止的回答!我一直在尝试并简化为df %>% mutate_if(is.factor, tolower)。这会在控制台中以小写形式返回所有因子变量值,但实际上似乎并没有改变 df
  • 好吧,df 永远不会改变,除非您重新签名更改。你需要写df <- df %>% mutate_if(is.factor, tolower)
  • 啊,我现在明白了。事后看来,我发现我不了解管道操作员,但我查了一下,它更有意义。我仍然遇到的一个问题是tolower() 将因子变量转换为字符变量。将levels() 嵌套在tolower() 中就可以解决这个问题。我的最终代码是df <- df %>% mutateif(is.factor, tolower(levels(df[])))。无论出于何种原因,因子变量之一不会变为小写,但该变量值的大写不会引入任何无根据的唯一值。谢谢斯拉法!

标签: r dataframe dplyr


【解决方案1】:

您可以只使用as.factor(tolower(as.character(x)) 中的 lambda 函数,而不是将级别设置为小写:

library(dplyr) 
df %>% mutate_if(
    .predicate = is.factor,
    .funs = function(x) as.factor(tolower(as.character(x)))
)

【讨论】:

    【解决方案2】:

    单线解决方案可能被高估了。为什么不直接制作自己的辅助函数,然后如果您发现需要它做更多的事情,您可以进一步自定义它。

    dftolower <- function(df){
      for(nm in names(df)){
        if(is.factor(df[,nm])){
          levels(df[,nm]) <- tolower(levels(df[,nm]))
        }else if(is.character(df[,nm])){
          df[,nm] <- tolower(df[,nm])
        }
      }
      return(df)
    }
    

    【讨论】:

      【解决方案3】:

      我在我的问题中没有明确表示我想将变量作为因素进行维护。我根据提供的其他答案得出的答案是:

      df &lt;- df %&gt;% mutateif(is.factor, tolower(levels(df[])))

      【讨论】:

      • mutateif 应该是 mutate_if() 不知道这是否是一个变化。但即使有了这种变化,这也不起作用。我怀疑 TIdyverse 有一些变化。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 2020-03-08
      • 1970-01-01
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多