【问题标题】:How do I convert a variable of more than 2 vectors into a dummy variable?如何将超过 2 个向量的变量转换为虚拟变量?
【发布时间】:2017-04-08 20:38:51
【问题描述】:

现在,我正在尝试从具有两个以上向量的变量中创建一个新的虚拟变量。更具体地说,我的数据集有一个“州”变量,我想制作一个虚拟变量,其中 1 = 北方的州,0 = 所有其他州。这是数据集的一部分(这是一个非常大的集合,所以我只包括基本数据):

  Year     StateICP  
1 1940        71     
2 1940        21     
3 1940        22     
4 1940        32     
5 1940        18     
6 1940        22  
7 1940        45     
8 1940        40     
9 1940        33     

所以我想做的是创建一个新列(称为“North”),如果 StateICP = 21、22、40 或 45,则新变量 = 1,否则为 0。比如我说,这是一个非常大的数据集(超过 1000000 个观察值),所以我无法手动逐行输入。我尝试了一个 ifelse 函数,但这只会给我错误。

我确信这并不复杂,但我对 R 还很陌生。我知道如何正常创建一个虚拟变量,但我被困在这里。任何帮助将不胜感激!谢谢!

【问题讨论】:

  • 您的ifelse 是否类似于:ifelse(yourDF$StateICP %in% c(21, 22, 40, 45), 1, 0)

标签: r


【解决方案1】:

所以,创建简单的数据集来复制您上面的内容:

df <- data.frame(Year = rep(1940,500), StateICP = sample(1:100, 500, TRUE))

这将创建一个 data.frame,其中包含您描述的列和 500 条记录。 StateICP 值是 1 到 100 之间随机生成的整数。如果我们想编写一个布尔值,我们可以简单地添加一个新列:

df$boolean <- df$StateICP %in% c(21, 22, 40, 45)

如果我们想按照您的描述将它们专门编码为 0,1,那么您可以使用 ifelse:

df$dummy <- ifelse(df$StateICP %in% c(21, 22, 40, 45), 1, 0)

你必须确保你在 ifelse 中使用了一个向量(因为它不接受数据参数)。

【讨论】:

  • 不需要ifelse,你可以做as.integer(df$StateICP %in% c(21, 22, 40, 45))
  • 是的,我主要包括它,以防其他人有同样的问题并想要使用实际标签,例如“北”和“南”,但我同意你的观点。
  • 在这种情况下,您可以(作为替代)也可以使用c('out','in')[1 + (df$StateICP %in% c(21, 22, 40, 45))],这要快得多
  • 哇。我不敢相信我从来没有想过这样做。谢谢。
猜你喜欢
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 2022-08-03
  • 2016-03-07
相关资源
最近更新 更多