我正在使用一个名为“ 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“,但这给我一个错误
答案 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)
}