为熔化/聚集中的新列指定类

Umaomamaomao

我想在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"))
阿克伦

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

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

但是,假设如果我们需要在一个步骤中执行此操作,请创建一个vector函数,然后使用Map将其应用get

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章