【问题标题】:How to convert all factor variables into numeric variables in a large data frame without loosing variables labels?如何在不丢失变量标签的情况下将大型数据框中的所有因子变量转换为数值变量?
【发布时间】:2020-03-11 05:40:08
【问题描述】:

我正在尝试将所有因子变量转换为大型数据框中的数值变量。转换时,变量标签(变量的详细名称)在新数据框中丢失。是否有任何简单的方法可以将因子变量转换为数据框中的数字变量而不会丢失变量。示例代码如下。谢谢。

v1 <- c('1','4','5')
v2 <- c('21000', '23400', '26800')
v3 <- c('2010','2008','2007')
data <- data.frame(v1, v2, v3)
library(Hmisc)
label(data$v1) <- "Number"
label (data$v2) <- "Value"
label (data$v3) <- "Year"

data[] <- as.numeric(factor(as.matrix(data)))
View(data)

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以预先保存属性并恢复它们。

    ## save labels
    attr.data <- lapply(dat, attr, "label")  
    
    ## convert to numeric and restore labels
    dat[] <- Map(function(x, y) `attr<-`(as.numeric(levels(x))[x], "label", y), dat, attr.data)
    

    一步到位:

    dat[] <- Map(function(x, y) 
      `attr<-`(as.numeric(levels(x))[x], "label", y), dat, Map(attr, dat, "label"))
    

    说明

    标签存储在属性中(试试attributes(data)),可以使用attr 及其名称进行访问。标签属性的名称是"label",我们可以在转换过程中捕获它们。 Map 以相应的方式处理列和属性,以确保分配正确的标签。

    结果

    dat
    #   v1    v2   v3
    # 1  1 21000 2010
    # 2  4 23400 2008
    # 3  5 26800 2007
    
    str(dat)
    # 'data.frame': 3 obs. of  3 variables:
    #   $ v1: num  1 4 5
    # ..- attr(*, "label")= chr "Number"
    # $ v2: num  21000 23400 26800
    # ..- attr(*, "label")= chr "Value"
    # $ v3: num  2010 2008 2007
    # ..- attr(*, "label")= chr "Year"
    

    数据

    dat <- structure(list(v1 = structure(1:3, .Label = c("1", "4", "5"), class = c("labelled", 
    "factor"), label = "Number"), v2 = structure(1:3, .Label = c("21000", 
    "23400", "26800"), class = c("labelled", "factor"), label = "Value"), 
        v3 = structure(3:1, .Label = c("2007", "2008", "2010"), class = c("labelled", 
        "factor"), label = "Year")), row.names = c(NA, -3L), class = "data.frame")
    

    旁注:我在这里使用dat而不是data,因为data已经被R占用来加载特定的数据集。

    【讨论】:

      猜你喜欢
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 2019-09-01
      相关资源
      最近更新 更多