R:根据另一个变量为一个变量的值创建虚拟变量

标签 r loops vectorization assign dummy-variable

原始问题

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

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

我正在寻找生产:

  • var1 满足:如果 x == 1,则 z$var1 == 1,否则如果 y == NA,则 z$var1 == NA,否则 z$var1 == 0。
  • var2 满足:如果 x == 2,则 z$var2 == 1,否则如果 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 <- c(1, 1, NA, 0, NA) 和 z$var2 <- c(NA, 0, 1, 0, 不适用)。原始解决方案生成 z$var1 <- z$var2 <- c(1,1,NA,0,NA)。

最佳答案

您可以使用矢量化的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

关于R:根据另一个变量为一个变量的值创建虚拟变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37925734/

相关文章:

r - R table() 计数中出现不存在的值

python - 使用嵌套循环和一些 numpy 函数调用进行多重处理

C 代码在 Intel Xeon E5-2650 上的性能

c++ - 这里循环携带的依赖在哪里?

python - 矢量化 - 添加没有循环的 numpy 数组?

当列名在别处预定义时,R data.table 在条件子集设置方面苦苦挣扎

r - 我想按之前的近日期将我的数据框过滤到给定日期

r - 如何修复 ggplot2 中图例的这种奇怪行为?

mysql - SQL循环得到一个空值

java - 我正在比较来自 2 个独立数组的 2 组整数值