【问题标题】:One-hot encoding in R- creating dataframe column names from variables in a loop [closed]R中的单热编码-从循环中的变量创建数据框列名[关闭]
【发布时间】:2018-11-28 05:03:11
【问题描述】:

我正在使用一个名为“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
}
}

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

【问题讨论】:

  • 请添加一个可重现的示例以及预期的输出。
  • 你不需要一个for循环来做一个热编码,请给我们提供可重复的例子。

标签: r one-hot-encoding


【解决方案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="_") 

【讨论】:

  • 当我尝试这样做时,我收到以下错误消息:“sort.list(y) 中的错误:'x' 对于 'sort.list' 必须是原子的列表?”这可能是因为我的数据报列“季节”具有数值,而不是像您看起来的字符串。你知道我可以改变什么来解决这个问题吗?谢谢
  • 看看我添加了你的季节数据的更新答案。代码运行良好
【解决方案2】:

别人刚刚教我怎么做:

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)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 2020-02-17
    • 2018-08-28
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    相关资源
    最近更新 更多