R 中的单热编码 - 从循环中的变量创建数据帧列名
One-hot encoding in R- creating dataframe column names from variables in a loop
我正在使用一个名为 "rawData" 的数据框,它有一个名为 "Season" 的列,其值范围为 1 到 4。
我正在尝试使用循环来执行单热编码,即创建 4 个名为 "Season 1"、"Season 2"、"Season 3"、"Season 4" 的新列,其中每列都有一个1/0 的二进制指示符值显示列名称中的季节是否针对每个数据点发生。到目前为止我试过这个:
for (i in 1:4){
text<-paste("Season", toString(i), sep = " ")
if (rawData$season==i) {
rawData$text<-1
}
}
但是,我只是在我的数据框中得到一个名为 "text" 的附加列,所有值都为 1。我明白为什么 R 这样做,但我想不出另一种方法让它做我想做的事。我尝试更改 if-then 语句以将 "rawData$text" 更改为 "rawData$paste("Season", toString(i), sep = " ")<-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="_")
其他人刚刚向我展示了如何操作:
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)
}
我正在使用一个名为 "rawData" 的数据框,它有一个名为 "Season" 的列,其值范围为 1 到 4。 我正在尝试使用循环来执行单热编码,即创建 4 个名为 "Season 1"、"Season 2"、"Season 3"、"Season 4" 的新列,其中每列都有一个1/0 的二进制指示符值显示列名称中的季节是否针对每个数据点发生。到目前为止我试过这个:
for (i in 1:4){
text<-paste("Season", toString(i), sep = " ")
if (rawData$season==i) {
rawData$text<-1
}
}
但是,我只是在我的数据框中得到一个名为 "text" 的附加列,所有值都为 1。我明白为什么 R 这样做,但我想不出另一种方法让它做我想做的事。我尝试更改 if-then 语句以将 "rawData$text" 更改为 "rawData$paste("Season", toString(i), sep = " ")<-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="_")
其他人刚刚向我展示了如何操作:
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)
}