Vraag Hoe verander je de functie melt.data.frame in reshape2-pakket geretourneerde kolom 'variable' naar 'character'?


Het standaardgedrag van melt.data.frame is om de kolom "variable" terug te zetten in de klasse "factor". Hier is een voorbeeld:

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

De vraag is dat er een parameter is om de klasse van factor naar karakter te veranderen? Ik heb geprobeerd options(stringsAsFactors = FALSE) maar het werkt niet.


11
2017-09-14 21:20


oorsprong


antwoorden:


Ik geloof niet dat er een dergelijke optie is ingebouwd melt.data.frame. Als u de code echter inspecteert, is het niet moeilijk om deze te wijzigen. We kunnen een nieuwe functie definiëren melt.df die de relevante regel vervangt door een snelle controle om te zien of de gebruiker heeft ingesteld 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]])))
}

Ik controleerde dit op je eenvoudige voorbeeld en het werkte zoals verwacht, maar ik heb het niet meer in het algemeen gecontroleerd, dus pas op. Ik ben er niet van overtuigd dat deze aanpassing in andere omstandigheden geen verrassend gedrag zal produceren.


5
2017-09-14 21:44



Met de meeste gebruikers op weg naar de "tidyverse" of "data.table" voor het opnieuw vormgeven van gegevens deze dagen, zijn uw opties verbeterd.

In de "tidyverse", is het standaardgedrag om de gesmolten variabele als te houden 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 ...

In de "data.table" -implementatie van melt, er zijn een paar nieuwe argumenten toegevoegd, waarvan er één is variable.factor die kan worden ingesteld op FALSE. Het is ingesteld op TRUE standaard voor, geloof ik, consistentie met de "hervormde 2" implementatie van 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> 

2
2017-12-14 08:42