R中一组列的热编码

R中一组列的热编码,r,dataframe,machine-learning,one-hot-encoding,dummy-variable,R,Dataframe,Machine Learning,One Hot Encoding,Dummy Variable,我试图对R中的df列子集进行热编码 一种热编码是将分类变量转换为一种形式的过程,这种形式可以提供给ML算法,通过将字符串列转换为该列中每个字符串的二进制列来更好地进行预测 Supose我们有一个df,看起来像这样: mes work_location birth_place 01/01/2000 China Chile 01/02/2000 Mexico Japan 01/03/2000 China

我试图对R中的df列子集进行热编码

一种热编码是将分类变量转换为一种形式的过程,这种形式可以提供给ML算法,通过将字符串列转换为该列中每个字符串的二进制列来更好地进行预测

Supose我们有一个df,看起来像这样:

mes          work_location  birth_place
01/01/2000      China           Chile
01/02/2000      Mexico           Japan
01/03/2000      China            Chile
01/04/2000      China           Argentina
01/05/2000      USA              Poland
01/06/2000      Mexico           Poland
01/07/2000      USA              Finland
01/08/2000      USA              Finland
01/09/2000      Japan             Norway
01/10/2000      Japan             Kenia
01/11/2000      Japan              Mali
01/12/2000      India              Mali

以下是热编码的代码:

## function to hot-encode ##
columna_dummy <- function(df, columna) {
  df %>% 
    mutate_at(columna, ~paste(columna, eval(as.symbol(columna)), sep = "_")) %>% 
    mutate(valor = 1) %>% 
    spread(key = columna, value = valor, fill = 0)
}

## selecting columns ##
columnas <- c("work_location", "birth_place")

## applying loop to repeat columna_dummy function for each df column ##


for(i in 1:length(columnas)){
    new_dataset <- columna_dummy(df, i)
   } 
列mes它是一个日期类列,但是它不包括在列原子向量中 它仍然会引起上述错误

对于所选字符串df列中的每个字符串,预期输出应与此类似:

我无法添加每一个专栏,但work_location_China就是一个例子 列的外观

mes          work_location  birth_place    work_location_China   
01/01/2000      China           Chile              1
01/02/2000      Mexico           Japan             0
01/03/2000      China            Chile             1
01/04/2000      China           Argentina          1
01/05/2000      USA              Poland            0
01/06/2000      Mexico           Poland            0
01/07/2000      USA              Finland           0
01/08/2000      USA              Finland           0
01/09/2000      Japan             Norway           0
01/10/2000      Japan             Kenia            0
01/11/2000      Japan              Mali            0
01/12/2000      India              Mali            0


是否有其他方法应用此循环?

当我们传递字符串时,一个选项是选择列select可以同时使用引号/未引号,创建一列1s'valor'和一列行号'rn',然后从'long'重塑为'wide'pivot\u

-输出

head(out, 2)
#         mes work_location birth_place work_location_China work_location_Mexico work_location_USA work_location_Japan
#1 01/01/2000         China       Chile                   1                    0                 0                   0
#2 01/02/2000        Mexico       Japan                   0                    1                 0                   0
#  work_location_India birth_place_Chile birth_place_Japan birth_place_Argentina birth_place_Poland birth_place_Finland
#1                   0                 1                 0                     0                  0                   0
#2                   0                 0                 1                     0                  0                   0
#  birth_place_Norway birth_place_Kenia birth_place_Mali
#1                  0                 0                0
#2                  0                 0                0
数据
通过使用purrr库,我解决了这个问题:

## data ##

df <- structure(list(mes = c("01/01/2000", "01/02/2000", "01/03/2000", 
"01/04/2000", "01/05/2000", "01/06/2000", "01/07/2000", "01/08/2000", 
"01/09/2000", "01/10/2000", "01/11/2000", "01/12/2000"), work_location = c("China", 
"Mexico", "China", "China", "USA", "Mexico", "USA", "USA", "Japan", 
"Japan", "Japan", "India"), birth_place = c("Chile", "Japan", 
"Chile", "Argentina", "Poland", "Poland", "Finland", "Finland", 
"Norway", "Kenia", "Mali", "Mali")), class = "data.frame", 
row.names = c(NA, 
-12L))

## function to hot-encode ##

columna_dummy <- function(df, columna) {
  df %>% 
    mutate_at(columna, ~paste(columna, eval(as.symbol(columna)), sep = "_")) %>% 
    mutate(valor = 1) %>% 
    spread(key = columna, value = valor, fill = 0)
}

## vector of columns ##

columnas <- c("work_location", "birth_place")


## hot_encoded_dataset ##
library(purrr)

hot_encoded_dataset <- purrr :: map(columnas , columna_dummy, df = df) %>% 
  reduce(inner_join) 


有可能在工作地点和出生地点这两个栏目中循环进行吗?@AlvaroMartinez更新了这篇文章。如果两个列中都有重复的名称,应如何重命名这是工作位置的示例,列名应为粘贴工作位置,工作位置,sep=\I在测试select中的错误时出现下一个错误,columna:unused argument columna调用自:function_list[[I]]value@AlvaroMartinez我没有得到这个函数的错误
out <- imap_dfc(setNames(c("work_location", "birth_place"),
        c("work_location", "birth_place")) , ~ {
     nm1 <- as.character(.y)
    columna_dummy(df = df, columna = .x) %>% 
      rename_all(~ str_c(nm1, ., sep="_"))
       }) %>%            
      bind_cols(df, .)
head(out, 2)
#         mes work_location birth_place work_location_China work_location_Mexico work_location_USA work_location_Japan
#1 01/01/2000         China       Chile                   1                    0                 0                   0
#2 01/02/2000        Mexico       Japan                   0                    1                 0                   0
#  work_location_India birth_place_Chile birth_place_Japan birth_place_Argentina birth_place_Poland birth_place_Finland
#1                   0                 1                 0                     0                  0                   0
#2                   0                 0                 1                     0                  0                   0
#  birth_place_Norway birth_place_Kenia birth_place_Mali
#1                  0                 0                0
#2                  0                 0                0
df <- structure(list(mes = c("01/01/2000", "01/02/2000", "01/03/2000", 
"01/04/2000", "01/05/2000", "01/06/2000", "01/07/2000", "01/08/2000", 
"01/09/2000", "01/10/2000", "01/11/2000", "01/12/2000"), work_location = c("China", 
"Mexico", "China", "China", "USA", "Mexico", "USA", "USA", "Japan", 
"Japan", "Japan", "India"), birth_place = c("Chile", "Japan", 
"Chile", "Argentina", "Poland", "Poland", "Finland", "Finland", 
"Norway", "Kenia", "Mali", "Mali")), class = "data.frame", 
row.names = c(NA, 
-12L))
## data ##

df <- structure(list(mes = c("01/01/2000", "01/02/2000", "01/03/2000", 
"01/04/2000", "01/05/2000", "01/06/2000", "01/07/2000", "01/08/2000", 
"01/09/2000", "01/10/2000", "01/11/2000", "01/12/2000"), work_location = c("China", 
"Mexico", "China", "China", "USA", "Mexico", "USA", "USA", "Japan", 
"Japan", "Japan", "India"), birth_place = c("Chile", "Japan", 
"Chile", "Argentina", "Poland", "Poland", "Finland", "Finland", 
"Norway", "Kenia", "Mali", "Mali")), class = "data.frame", 
row.names = c(NA, 
-12L))

## function to hot-encode ##

columna_dummy <- function(df, columna) {
  df %>% 
    mutate_at(columna, ~paste(columna, eval(as.symbol(columna)), sep = "_")) %>% 
    mutate(valor = 1) %>% 
    spread(key = columna, value = valor, fill = 0)
}

## vector of columns ##

columnas <- c("work_location", "birth_place")


## hot_encoded_dataset ##
library(purrr)

hot_encoded_dataset <- purrr :: map(columnas , columna_dummy, df = df) %>% 
  reduce(inner_join)