【问题标题】:Specify class for new columns in melt/gather为熔化/聚集中的新列指定类
【发布时间】:2017-05-04 03:15:42
【问题描述】:

我想在melt(或gather)中指定输出列的类别。我想对所有列和不同的类都这样做。

例如,我有一些数据:

example <- data.frame(day = c(1, 2), max = c(20, 21), min = c(1, 2))

> example
  day max min
1   1  20   1
2   2  21   2

我融化了这些数据

exmelt <- melt(example, id.vars = "day", variable.name = "minmax", value.name = "temp")

> exmelt
  day minmax temp
1   1    max   20
2   2    max   21
3   1    min    1
4   2    min    2

 > str(exmelt)
'data.frame':   4 obs. of  3 variables:
 $ day   : num  1 2 1 2
 $ minmax: Factor w/ 2 levels "max","min": 1 1 2 2
 $ temp  : num  20 21 1 2

假设我希望 day 成为类因子,temp 成为类整数

as.factor()融合后我可以做到这一点

exmelt$day <- as.factor(exmelt$day)
exmelt$temp <- as.integer(exmelt$temp)

> str(exmelt)
'data.frame':   4 obs. of  3 variables:
$ day   : Factor w/ 2 levels "1","2": 1 2 1 2
$ minmax: Factor w/ 2 levels "max","min": 1 1 2 2
$ temp  : int  20 21 1 2

对于包含许多列和不同类、某些因子、某些整数等的复杂数据框,之后再执行此操作将是乏味且混乱的。

有没有办法将它包含在melt 中?比如说

 melt(example,
      id.vars = "day",
      variable.name = "minmax",
      value.name = "temp",
      colClasses = c("factor", "factor", "integer"))

【问题讨论】:

    标签: r reshape2 tidyr


    【解决方案1】:

    我们可以使用data.table 中的melt,它也有variable.factorvalue.factor 选项。除此之外,colClasses 不是其中的参数。

    dM <- melt(setDT(example), id.vars = "day", variable.name = "minmax",
               value.name = "temp", variable.factor=FALSE)
    

    但是,假设如果我们需要一步完成,创建一个 vector 的函数,然后使用 Mapget 应用它

    f1 <- c("as.factor", "as.factor", "as.integer")
    dM[, names(dM) := Map(function(x,y) get(y)(x), .SD, f1)]
    str(dM)
    # Classes ‘data.table’ and 'data.frame':  4 obs. of  3 variables:
    # $ day   : Factor w/ 2 levels "1","2": 1 2 1 2
    # $ minmax: Factor w/ 2 levels "max","min": 1 1 2 2
    # $ temp  : int  20 21 1 2
    

    【讨论】:

      猜你喜欢
      • 2014-07-11
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多