【问题标题】:Convert all columns to characters in a data.frame将所有列转换为 data.frame 中的字符
【发布时间】:2017-10-03 00:15:26
【问题描述】:

考虑一个包含多种数据类型的 data.frame。

出于奇怪的目的,用户需要将所有列转换为字符。 怎么做最好?一个 tidyverse 的解决方案尝试是这样的:

map(mtcars,as.character) %>% map_df(as.list) %>% View()
c2<-map(mtcars,as.character) %>% map_df(as.list)

当我打电话给str(c2) 时,它应该说一个包含所有字符的 tibble 或 data.frame。

另一个选项是write.csv()write_csv() 中的一些参数设置,以在结果文件输出中实现相同的效果。

【问题讨论】:

    标签: r dataframe tidyverse


    【解决方案1】:

    在基础 R 中:

    x[] <- lapply(x, as.character)
    

    这会将列转换为适当的字符类,保留 data.frame 的属性。调用data.frame() 会导致他们丢失。

    使用 dplyr 保留属性:dplyr::mutate(across(everything(), as.character)) 期间似乎保留了属性。之前它们被dplyr::mutate_all 销毁。

    示例

    x <- mtcars
    attr(x, "example") <- "1"
    

    在下面的第二种情况下,example 属性被保留:

    # Destroys attributes
    
    data.frame(lapply(x, as.character)) %>%
      attributes()
    
    # Preserves attributes
    
    x[] <- lapply(x, as.character)
    attributes(x)
    

    【讨论】:

    • 我觉得这个可以简化为x[] &lt;- lapply(x, as.character)
    • 这是 IMO 的最佳答案,因为它保留了 data.frame 的属性。 @Sam 有什么理由不像 sindri 建议的那样简单吗?
    • 好电话,我已经用这个更简单的命令更新了答案
    • @sindri_baldur 你能解释一下x[] &lt;- lapply(x, as.character) 的工作原理吗?我的意思是,lapply 接受列表并返回列表。 lapply 是如何处理数据框的?
    【解决方案2】:

    编辑:2021-03-01

    从 dplyr 1.0.0 开始,_all() 函数变体被取代。实现这一点的新方法是使用新的across() 函数。

    library(dplyr)
    mtcars %>%
      mutate(across(everything(), as.character))
    

    使用across(),我们使用tidyselect helpers 选择我们想要修改的列集(这里我们使用everything() 选择所有列),然后指定我们要应用于每个选定列的函数.在这种情况下,即as.character()

    原答案:

    您也可以使用dplyr::mutate_all

    library(dplyr)
    mtcars %>%
      mutate_all(as.character)
    

    【讨论】:

      【解决方案3】:

      接受的答案中的mutate_allsuperseded

      您可以将mutate() 函数与across() 一起使用:

      library(dplyr)
      
      mtcars %>% 
        mutate(across(everything(), as.character))
      

      【讨论】:

      • 谢谢!我已经更新了答案以反映更新的 dplyr 语法。
      【解决方案4】:

      使用data.table的最有效方式-

      data.table::setDT(mtcars)
      mtcars[, (colnames(mtcars)) := lapply(.SD, as.character), .SDcols = colnames(mtcars)]
      

      注意:您可以使用它来将data table 的几列转换为所需的列类型。

      如果我们想将所有列转换为字符,那么我们也可以这样做-

      to_col_type <- function(col_names,type){
                  get(paste0("as.", type))(dt[[col_names]])
                  }
      mtcars<- rbindlist(list(Map(to_col_type ,colnames(mtcars),"character")))
      

      【讨论】:

        【解决方案5】:

        这可能有效,但不确定它是否是最好的。

        df = data.frame(lapply(mtcars, as.character))
        str(df)
        

        【讨论】:

          猜你喜欢
          • 2014-10-31
          • 2011-02-20
          • 2020-08-10
          • 2021-11-23
          • 2018-05-17
          • 1970-01-01
          • 2016-03-03
          • 1970-01-01
          相关资源
          最近更新 更多