如何更改reshape2包中的melt.data.frame函数将"变量"列返回到"字符"类?

rni*_*nja 12 r reshape melt reshape2

melt.data.frame的默认行为是返回"factor"类中的"variable"列.这是一个例子:

> 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"
Run Code Online (Sandbox Code Playgroud)

问题是,是否有任何参数可以将类从因子更改为字符?我试过options(stringsAsFactors = FALSE)但它不起作用.

jor*_*ran 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]])))
}
Run Code Online (Sandbox Code Playgroud)

我在你的简单示例上检查了这个,它按预期工作,但我没有更普遍地检查它,所以要小心.我不相信这种修改在其他情况下不会产生令人惊讶的行为.

  • 我认为你最好将另一个函数包装在`df $ variable < - as.character(df $ variable)中. (5认同)
  • @hadley拥有一个通用的包装器并不简单:`melt.data.frame`的变量列的参数名称不同于`melt.matrix`(`variable.name` vs`varnames`).如果实际的"融化"可以使用字符而不是因子,那会更好. (4认同)

A5C*_*2T1 5

如今,随着大多数用户转向“tidyverse”或“data.table”来重塑数据,您的选择得到了改进。

在“tidyverse”中,默认行为是将熔融变量保持为characters:

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 ...
Run Code Online (Sandbox Code Playgroud)

在 的“data.table”实现中melt,添加了一些新参数,其中之一variable.factor可以设置为FALSETRUE我相信它默认设置为与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> 
Run Code Online (Sandbox Code Playgroud)