簡體   English   中英

如何更改reshape2包中的melt.data.frame函數將“變量”列返回到“字符”類?

[英]How to change the melt.data.frame function in reshape2 package returned “variable” column to “character” class?

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"

問題是,是否有任何參數可以將類從因子更改為字符? 我嘗試了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]])))
}

我在你的簡單示例上檢查了這個,它按預期工作,但我沒有更普遍地檢查它,所以要小心。 我不相信這種修改在其他情況下不會產生令人驚訝的行為。

由於大多數用戶現在都要使用“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> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM