【问题标题】:R: Creating dummy variables for values of one variable conditional on another variableR:为以另一个变量为条件的一个变量的值创建虚拟变量
【发布时间】:2016-10-21 21:34:11
【问题描述】:

原始问题

我想在数据框中为该数据框中的每个 x 值添加一系列虚拟变量,但如果另一个变量为 NA,则包含 NA。例如,假设我有以下数据框:

x <- seq(1:5)
y <- c(NA, 1, NA, 0, NA)
z <- data.frame(x, y)

我正在寻找制作:

  • var1 使得:z$var1 == 1 如果 x == 1,否则如果 y == NA,z$var1 == NA,否则 z$var1 == 0。
  • var2 使得:z$var2 == 1 如果 x == 2,否则如果 y == NA,z$var2 == NA,否则 z$var2 == 0。
  • var3 等

我似乎无法弄清楚如何对其进行矢量化。我正在寻找一种可用于大量 x 值的解决方案。

更新

我想遍历 x 的每个索引时有些困惑。我不是在寻找这个,而是寻找一个为 x 的每个唯一值创建一个变量的解决方案。将以下数据作为输入时:

x <- c(1,1,2,3,9)
y <- c(NA, 1, NA, 0, NA)
z <- data.frame(x, y)

我正在寻找 z$var1, z$var2, z$var3, z$var9 其中 z$var1

【问题讨论】:

    标签: r loops vectorization assign dummy-variable


    【解决方案1】:

    您可以使用矢量化的ifelse 来构造变量:

    cbind(z, setNames(data.frame(sapply(unique(x), function(i) ifelse(x == i, 1, ifelse(is.na(y), NA, 0)))), 
                      paste("var", unique(x), sep = "")))
    
      x  y var1 var2 var3 var9
    1 1 NA    1   NA   NA   NA
    2 1  1    1    0    0    0
    3 2 NA   NA    1   NA   NA
    4 3  0    0    0    1    0
    5 9 NA   NA   NA   NA    1
    

    更新

    cbind(z, data.frame(sapply(unique(x), function(i) ifelse(x == i, 1, ifelse(is.na(y), NA, 0)))))
      x  y X1 X2 X3 X4
    1 1 NA  1 NA NA NA
    2 1  1  1  0  0  0
    3 2 NA NA  1 NA NA
    4 3  0  0  0  1  0
    5 9 NA NA NA NA  1
    

    【讨论】:

    • 不完全。 var1、var2、var3 等的值只能是 {0, 1, NA]。我猜这应该是 ifelse(x == i, 1,... 另外,你能解释一下 setNames 是如何在这里工作的吗?不知道我为什么需要它。
    • 我不喜欢混淆条件和结果,请参阅更新。 setNames 只是一种设置列名的便捷方式。如果您不关心它,我们可以将其删除。
    • 更新:见上文。
    • 在您的原始数据中,x 没有重复值。如果您确实有并且不想创建重复变量,请在 x 周围放置一个 unique 函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多