从数据框中的所有分类变量创建虚拟变量

3
我需要对数据框中的所有分类列进行单编码。我找到了以下类似的代码:

one_hot <- function(df, key) {
  key_col <- dplyr::select_var(names(df), !! rlang::enquo(key))
  df <- df %>% mutate(.value = 1, .id = seq(n()))
  df <- df %>% tidyr::spread_(key_col, ".value", fill = 0, sep = "_") %>% 
  select(-.id)
}

但我不知道如何将其应用于所有分类列。

keys <- select_if(data, is.character)[-c(1:2)]
tmp <- map(keys, function(names) reduce(data, ~one_hot(.x, keys)))

抛出下一个错误

错误:变量必须计算为单个数字或列名,而不是列表

更新:

customers <- data.frame(
  id=c(10, 20, 30, 40, 50),
  gender=c('male', 'female', 'female', 'male', 'female'),
  mood=c('happy', 'sad', 'happy', 'sad','happy'),
  outcome=c(1, 1, 0, 0, 0))
customers

编码后

  id gender.female gender.male mood.happy mood.sad outcome
1 10             0           1          1        0       1
2 20             1           0          0        1       1
3 30             1           0          1        0       0
4 40             0           1          0        1       0
5 50             1           0          1        0       0

2
你能提供一个小的数据框示例以及你想要该数据框的结果是什么吗?这将有助于其他人回答你的问题。 - bschneidr
完成。但请想象我有更多的分类特征。 - Dmytro Fedoriuk
4个回答

4
使用 dummies 包:
library(dummies)
dummy.data.frame(customers)

  id genderfemale gendermale moodhappy moodsad outcome
1 10            0          1         1       0       1
2 20            1          0         0       1       1
3 30            1          0         1       0       0
4 40            0          1         0       1       0
5 50            1          0         1       0       0

4
同时,使用fastDummies包也可以轻松实现一行代码的编写。
fastDummies::dummy_cols(customers)

  id gender  mood outcome gender_male gender_female mood_happy mood_sad
1 10   male happy       1           1             0          1        0
2 20 female   sad       1           0             1          0        1
3 30 female happy       0           0             1          1        0
4 40   male   sad       0           1             0          0        1
5 50 female happy       0           0             1          1        0

2
这里介绍一种使用recipes包的方法。
library(dplyr)
library(recipes)

# Declares which variables are the predictors
recipe(formula = outcome ~ .,
       data = customers) %>% 
# Declare that one-hot encoding will be applied to all nominal variables
step_dummy(all_nominal(),
           one_hot = TRUE) %>% 
# Based on the previous declarations, apply transformations to the data
# and return the resulting data frame
prep() %>% 
juice()

非常感谢您提供的答案。recipes::step_dummy 提供了很多灵活性,可以更直观地对变量子集进行虚拟化,比其他方法更容易实现。 - elcortegano

0
一行代码使用mltoolsdata.table

one_hot(as.data.table(customers))

   id gender_female gender_male mood_happy mood_sad outcome
1: 10             0           1          1        0       1
2: 20             1           0          0        1       1
3: 30             1           0          1        0       0
4: 40             0           1          0        1       0
5: 50             1           0          1        0       0

它对所有因子变量进行独热编码,并具有一些很好的功能,可以处理NA和未使用的因子水平。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接