R中的一键编码-通过循环中的变量创建数据框列名称

时间:2018-11-28 05:03:12

标签: r one-hot-encoding

我正在使用一个名为“ rawData”的数据框,该数据框具有一个名为“ Season”的列,其值的范围为1到4。 我正在尝试使用循环执行一次热编码,即创建4个称为“第1季”,“第2季”,“第3季”,“第4季”的新列,其中每列的二进制指示符值为1/0显示每个数据点的列名称中的季节是否正在发生。到目前为止,我已经尝试过:

for (i in 1:4){
text<-paste("Season", toString(i), sep = " ")
if (rawData$season==i) {
rawData$text<-1
}
}

但是,我只是在数据框中获得了一个名为“文本”的附加列,且所有值均为= 1。我理解为什么R会这样做,但是我想不出另一种方法来使R做到我想要的。我尝试更改if-then语句,将“ rawData $ text”更改为“ rawData $ paste(“ Season”,toString(i),sep =“”)<-1“,但这给我一个错误

2 个答案:

答案 0 :(得分:1)

df <- data.frame(
  group = c('A', 'A', 'A', 'A', 'A', 'B', 'C'),
  student = c('01', '01', '01', '02', '02', '01', '02'),
  exam_pass = c('Y', 'N', 'Y', 'N', 'Y', 'Y', 'N'),
  subject = c('Math', 'Science', 'Japanese', 'Math', 'Science', 'Japanese', 'Math')
)

library(dummy)
library(dummies)

df1 <- dummy.data.frame(df, names=c("subject"), sep="_") 

此可重现的示例代码将帮助您进行一次热编码,而无需使用for循环。

您提供的示例同样适用于

df1 <- data.frame(seasons = c(1,3,2,4,3,4,1,1,1))

library(dummy)
library(dummies)

df2 <- dummy.data.frame(df1, names=c("seasons"), sep="_") 

答案 1 :(得分:0)

其他人只是告诉我怎么做:

df <- data.frame(seasons = c(1,3,2,4,3,4,1,1,1))
for(i in unique(df$seasons)) {
  df[[paste0("season_",i)]] <- ifelse(df$seasons==i,1,0)
}