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)但它不起作用.
我不相信有这样的选择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)
我在你的简单示例上检查了这个,它按预期工作,但我没有更普遍地检查它,所以要小心.我不相信这种修改在其他情况下不会产生令人惊讶的行为.
如今,随着大多数用户转向“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可以设置为FALSE。TRUE我相信它默认设置为与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)