【问题标题】:Batch Converting Numeric to Factor将数值批量转换为因子
【发布时间】:2018-06-06 15:59:42
【问题描述】:

我正在尝试在 R 中将 numericcharacter 类变量批量转换为 factor。我觉得这应该很简单,但实际上我遇到了一个问题

我所做的是在这里:

>sapply(df, class)
    a           b          c
"numeric"   "numeric"  "numeric" 

>col.names <- c("a", "b", "c")
>df[,col.names] <- sapply(df[,col.names], as.factor)

我得到的结果是这样的:

>sapply(df, class)
     a            b            c
"character"  "character"  "character"

我试图弄清楚为什么它不会从数字转换为因子,而是转为字符。

通常问题是从因子到数值,所以我无法找到有关此类问题的任何信息。

【问题讨论】:

  • 尝试完全相同但使用lapply
  • 这成功了!你能告诉我为什么 lapply 有效而 sapply 无效吗?是因为 sapply 在向量上被简化了吗?
  • 伊万的回答解释了差异。
  • 是的。并且强制是最小公分母character

标签: r


【解决方案1】:

我想,在这种情况下,sapply() 会返回一个矩阵,这不是一个因素。使用

df[,col.names] <- lapply(df[,col.names], as.factor)

lapply() 返回因子列表以将它们插入到您的 df 中。

【讨论】:

    【解决方案2】:

    你必须使用lapply。在以下示例中,我创建了两个相等的具有 4 列的 df。

    df <- df2 <- data.frame(a = 1:5, b = 6:10, c = 11:15, d = 16:20)
    col.names <- c("a", "b", "c")
    
    df[,col.names] <- lapply(df[,col.names], as.factor)
    sapply(df, class)
    #a         b         c         d 
    #"factor"  "factor"  "factor" "integer"
    

    注意,如果你想改变整个data.frame,你需要写方括号,df2[]

    df2[] <- lapply(df2, as.factor)
    sapply(df2, class)
    #a        b        c        d 
    #"factor" "factor" "factor" "factor"
    

    【讨论】:

      【解决方案3】:

      尝试类似:

      df <- data.frame(sapply(df, as.factor))
      

      不同之处在于最后将其包含在 data.frame 中。

      【讨论】:

        【解决方案4】:

        这是tidyverse 解决方案。

        library(tidyverse)
        
        data <- tibble(x = c("blue", "green", y = c(1:2))
        
        data <- data %>%
          mutate(x = factor(x),
                 y = factor(y))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-20
          • 1970-01-01
          相关资源
          最近更新 更多