簡體   English   中英

將分類變量轉換為 R 中的數字

[英]Convert categorical variables to numeric in R

我有一個龐大的數據庫,並且有很多分類變量。 你可以在這里觀看:

> M=data.frame(Type_peau,PEAU_CORPS,SENSIBILITE,IMPERFECTIONS,BRILLANCE ,GRAIN_PEAU,RIDES_VISAGE,ALLERGIES,MAINS,
+              INTERET_ALIM_NATURELLE,INTERET_ORIGINE_GEO,INTERET_VACANCES,INTERET_COMPOSITION,DataQuest1,Priorite2,
+              Priorite1,DataQuest4,Age,Nbre_gift,w,Nbre_achat)
> # pour voir s'il y a des données manquantes
> str(M)
'data.frame':   836 obs. of  21 variables:
 $ Type_peau             : Factor w/ 5 levels "","Grasse","Mixte",..: 3 4 5 3 4 3 3 3 2 3 ...
 $ PEAU_CORPS            : Factor w/ 4 levels "","Normale","Sèche",..: 2 3 3 2 2 2 3 2 3 2 ...
 $ SENSIBILITE           : Factor w/ 4 levels "","Aucune","Fréquente",..: 4 4 4 2 4 3 4 2 4 4 ...
 $ IMPERFECTIONS         : Factor w/ 4 levels "","Fréquente",..: 3 4 3 4 3 2 3 4 3 3 ...
 $ BRILLANCE             : Factor w/ 4 levels "","Aucune","Partout",..: 4 2 2 4 4 4 4 4 3 4 ...
 $ GRAIN_PEAU            : Factor w/ 4 levels "","Dilaté","Fin",..: 4 4 4 2 4 2 4 4 2 4 ...
 $ RIDES_VISAGE          : Factor w/ 4 levels "","Aucune","Très visibles",..: 2 2 2 4 4 2 4 2 4 2 ...
 $ ALLERGIES             : Factor w/ 4 levels "","Non","Oui",..: 2 2 2 2 2 2 2 2 2 2 ...
 $ MAINS                 : Factor w/ 4 levels "","Moites","Normales",..: 3 4 4 3 3 3 3 4 4 4 ...
 $ INTERET_ALIM_NATURELLE: Factor w/ 4 levels "","Beaucoup",..: 2 4 4 4 2 2 2 4 4 2 ...
 $ INTERET_ORIGINE_GEO   : Factor w/ 5 levels "","Beaucoup",..: 2 4 2 5 2 2 2 2 2 2 ...
 $ INTERET_VACANCES      : Factor w/ 6 levels "","À la mer",..: 3 4 2 2 3 2 3 2 3 2 ...
 $ INTERET_COMPOSITION   : Factor w/ 4 levels "","Beaucoup",..: 2 2 2 4 2 2 2 2 4 2 ...
 $ DataQuest1            : Factor w/ 4 levels "-20","20-30",..: 4 3 4 4 4 3 3 2 3 2 ...
 $ Priorite2             : Factor w/ 7 levels "éclatante","hydratée",..: 3 1 3 4 3 2 7 1 4 6 ...
 $ Priorite1             : Factor w/ 7 levels "éclatante","hydratée",..: 4 6 1 5 1 6 1 2 6 4 ...
 $ DataQuest4            : Factor w/ 2 levels "nature","urbain": 2 2 2 2 2 1 2 2 2 2 ...
 $ Age                   : int  32 37 23 44 33 30 43 43 60 31 ...
 $ Nbre_gift             : int  1 4 1 1 2 1 1 1 1 1 ...
 $ w                     : num  0.25 0.25 0.5 0.25 0.5 0 0 0 0 0.75 ...
 $ Nbre_achat            : int  3 4 7 3 6 9 22 13 7 16 ...

我需要自動將所有分類變量轉換為數字。 例如對於變量Type_peau ,它是:

 head(Type_peau)
[1] Mixte   Normale Sèche   Mixte   Normale Mixte  
Levels:  Grasse Mixte Normale Sèche

我要它 :

head(Type_peau)
[1] 2 3 4 2 3 2
Levels: 1 2 3 4

如何為所有分類變量自動執行此操作?

您可以使用unclass()來顯示因子變量的數值:

Type_peau<-as.factor(c("Mixte","Normale","Sèche","Mixte","Normale","Mixte"))
Type_peau
unclass(Type_peau)

要對所有分類變量執行此操作,您可以使用sapply()

must_convert<-sapply(M,is.factor)       # logical vector telling if a variable needs to be displayed as numeric
M2<-sapply(M[,must_convert],unclass)    # data.frame of all categorical variables now displayed as numeric
out<-cbind(M[,!must_convert],M2)        # complete data.frame with all variables put together

編輯: A5C1D2H2I1M1N2O1R2T1 的解決方案一步工作:

out<-data.matrix(M)

它僅在您的 data.frame 不包含任何字符變量時才有效(否則,它們將被放入 NA)。

也許你在追求data.matrix 從函數的描述:

返回通過將數據框中的所有變量轉換為數值模式,然后將它們綁定在一起作為矩陣的列而獲得的矩陣。 因子和有序因子由它們的內部代碼代替。

例子:

mydf <- data.frame(A = letters[1:5],
                   B = LETTERS[1:5],
                   C = month.abb[1:5],
                   D = 1:5)
str(mydf)
# 'data.frame': 5 obs. of  4 variables:
#  $ A: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5
#  $ B: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5
#  $ C: Factor w/ 5 levels "Apr","Feb","Jan",..: 3 2 4 1 5
#  $ D: int  1 2 3 4 5
data.matrix(mydf)
#      A B C D
# [1,] 1 1 3 1
# [2,] 2 2 2 2
# [3,] 3 3 4 3
# [4,] 4 4 1 4
# [5,] 5 5 5 5

一次全部替換為:

mydf[] <- data.matrix(mydf)
mydf
#   A B C D
# 1 1 1 3 1
# 2 2 2 2 2
# 3 3 3 4 3
# 4 4 4 1 4
# 5 5 5 5 5

當然,如果您有更多的列類型,則必須首先決定如何處理它們。 例如,有人擔心如果有一個character列, data.matrix會導致一列NA值,這是正確的。 但是,正確的問題應該是“您希望如何處理character列?

這里有兩個選項。 您可以類似地為其他列類型擴展邏輯。

mydf <- data.frame(A = letters[1:5],
                   B = LETTERS[1:5],
                   C = month.abb[1:5],
                   D = 1:5)
mydf$E <- state.abb[1:5]
str(mydf)
# 'data.frame': 5 obs. of  5 variables:
#  $ A: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5
#  $ B: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5
#  $ C: Factor w/ 5 levels "Apr","Feb","Jan",..: 3 2 4 1 5
#  $ D: int  1 2 3 4 5
#  $ E: chr  "AL" "AK" "AZ" "AR" ...

## You want to convert everything to numeric
data.matrix(data.frame(unclass(mydf))) 
#      A B C D E
# [1,] 1 1 3 1 2
# [2,] 2 2 2 2 1
# [3,] 3 3 4 3 4
# [4,] 4 4 1 4 3
# [5,] 5 5 5 5 5

## You only want to convert factors to numeric
mydf[sapply(mydf, is.factor)] <- data.matrix(mydf[sapply(mydf, is.factor)])
mydf
#   A B C D  E
# 1 1 1 3 1 AL
# 2 2 2 2 2 AK
# 3 3 3 4 3 AZ
# 4 4 4 1 4 AR
# 5 5 5 5 5 CA
library(dplyr)

mydf <- data.frame(A = letters[1:5],
                   B = LETTERS[1:5],
                   C = month.abb[1:5],
                   D = 1:5)
glimpse(mydf)

# Observations: 5
# Variables: 4
# $ A <fctr> a, b, c, d, e
# $ B <fctr> A, B, C, D, E
# $ C <fctr> Jan, Feb, Mar, Apr, May
# $ D <int> 1, 2, 3, 4, 5

dplyr使用謂詞函數

mydf %>% mutate_if(is.factor, as.numeric)

#  A B C D
# 1 1 1 3 1
# 2 2 2 2 2
# 3 3 3 4 3
# 4 4 4 1 4
# 5 5 5 5 5

as.numeric也可以完成這項工作。

df <- iris
df$newgroup <- as.factor(rep(c(letters[1:10]))) # just another factor
str(df) # Species and newgroup are categorial variables

as.numeric(df$Species) # this returns the levels (numeric) of Species.
                       # Now, we want to apply this automatically to all
                       # categorical variables

# using lapply
i <- sapply(df, is.factor)
df[i] <- lapply(df[i], as.numeric)
str(df)

# using dplyr
#(load df again)
library(dplyr)
df2 <- df %>% mutate_if(is.factor, as.numeric)
str(df2)

# using purrr
library(purrr)
df3 <- df %>% map_if(is.factor, as.numeric)
str(df3)

如果您還想創建虛擬變量,請嘗試

library(dummies)
df.4 <- dummy.data.frame(df, sep = ".")

只是為了添加已經發布的答案,此鏈接提供了如何將分類數據轉換為數字的示例,但如果您對默認轉換不滿意,還可以將這些數字映射到指定值。

最好和最快的方法是使用下面的代碼:

DataFrameYouWant <- data.frame(yourData)
DataFrameYouWant[] <- lapply(DataFrameYouWant, as.integer)

上面的代碼會自動將數據中的所有因子變量轉換為數字,並將數據轉換為數據框。 您可以指定要將哪些列/變量轉換為數字。

這也可以使用因子函數一步完成。

M$colname = factor(M$colname, levels = c(level1,level2,...), labels = c(label1, label2,...))

注意:它將替換列。

暫無
暫無

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

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