Как изменить функцию melt.data.frame в пакете reshape2, возвращающую столбец «переменная» в класс «символ»? - PullRequest
12 голосов
/ 15 сентября 2011

Поведение по умолчанию для melt.data.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"

Вопрос в том, есть ли какой-нибудь параметр, чтобы изменить класс с фактора на символ? Я пытался options(stringsAsFactors = FALSE), но он не работает.

Ответы [ 2 ]

5 голосов
/ 15 сентября 2011

Я не верю, что есть такая опция, встроенная в 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]])))
}

Я проверил это на вашем простом примере, и он работал как ожидалось, но я не проверял это более широко, так что будьте осторожны.Я не уверен, что эта модификация не будет вызывать удивительного поведения в других обстоятельствах.

2 голосов
/ 14 декабря 2017

Поскольку в наши дни большинство пользователей переходят к «tidyverse» или «data.table» для изменения данных, ваши параметры улучшились.

В «tidyverse» поведение по умолчанию - это сохранениепеременная расплава как character s:

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> 
...