如何将reshape2包中的melt.data.frame函数返回的“variable”列更改为“character”类?

13

meldata.frame的默认行为是将“变量”列返回为“因子”类。以下是一个示例:

> head(airquality)

  ozone solar.r wind temp month day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
3    12     149 12.6   74     5   3
4    18     313 11.5   62     5   4
5    NA      NA 14.3   56     5   5
6    28      NA 14.9   66     5   6

> x = melt(head(airquality))
Using  as id variables

> head(x)
  variable value
1    ozone    41
2    ozone    36
3    ozone    12
4    ozone    18
5    ozone    NA
6    ozone    28

> class(x$variable)
[1] "factor"

问题是是否有参数可以将类从factor更改为character?我尝试过options(stringsAsFactors = FALSE)但它没有起作用。

2个回答

5

如今,大多数用户都转向“tidyverse”或“data.table”进行数据重塑,您的选项已经改善。

在“tidyverse”中,默认行为是将熔化变量保留为字符 (character) :

library(tidyverse)
airquality %>% gather(var, val, everything()) %>% str()
# 'data.frame': 918 obs. of  2 variables:
#  $ var: chr  "Ozone" "Ozone" "Ozone" "Ozone" ...
#  $ val: num  41 36 12 18 NA 28 23 19 8 NA ...

在 "data.table" 实现的 "melt" 中,添加了一些新的参数之一是 "variable.factor",可以设置为 "FALSE"。它默认设置为 "TRUE",我认为是为了与 "reshape2" 实现的 "melt" 保持一致。
library(data.table)
str(melt(as.data.table(airquality), variable.factor = FALSE))
# Classes ‘data.table’ and 'data.frame':    36 obs. of  2 variables:
#  $ variable: chr  "Ozone" "Ozone" "Ozone" "Ozone" ...
#  $ value   : num  41 36 12 18 NA 28 190 118 149 313 ...
#  - attr(*, ".internal.selfref")=<externalptr> 

5

我不认为 melt.data.frame 内置了这样的选项。但是,如果你检查代码,改变它并不难。我们可以定义一个新的函数 melt.df,将相关行替换为快速检查用户是否设置了 stringsAsFactors = FALSE

if (getOption("stringsAsFactors")){
    df[[variable_name]] <- factor(df[[variable_name]], 
                                   unique(df[[variable_name]]))
}
else{
   df[[variable_name]] <- as.character(factor(df[[variable_name]],         
                                   unique(df[[variable_name]])))
}

我在您的简单示例上进行了检查,它按预期工作,但我还没有进行更全面的检查,所以请注意。我无法确定这种修改是否会在其他情况下产生令人惊讶的行为。


5
我认为你最好将melt()函数包裹在另一个函数中,该函数执行df$variable <- as.character(df$variable) - hadley
@hadley,这在处理日期时很不方便。虽然能用。 - dmvianna
@dmvianna 请在 https://github.com/hadley/reshape/issues 上提交一个带有小例子的问题。 - hadley
4
@hadley 这并不是一个简单的问题,因为 melt.data.framemelt.matrix 的变量列参数名称不同(variable.name vs varnames)。如果实际的 melt 能够使用字符而不是因子,那就更好了。 - Konrad Rudolph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接