在melt / gather中指定新列的类

时间:2016-12-19 05:39:20

标签: r reshape2 tidyr

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

1 个答案:

答案 0 :(得分:3)

我们可以使用melt中的data.tablevariable.factor也有value.factorcolClasses选项。除此之外,dM <- melt(setDT(example), id.vars = "day", variable.name = "minmax", value.name = "temp", variable.factor=FALSE) 不是其中的论据。

vector

但是,假设我们需要在一个步骤中执行此操作,请创建Map个函数,然后使用getf1 <- 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

应用它
kSecAttrTokenIDSecureEnclave