R:为以另一个变量为条件的一个变量的值创建虚拟变量
R: Creating dummy variables for values of one variable conditional on another variable
原始问题
我想在数据框中为该数据框中的每个 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 <- c(1, 1, NA, 0, NA) 和 z$var2 <- c(不适用、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
原始问题
我想在数据框中为该数据框中的每个 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 <- c(1, 1, NA, 0, NA) 和 z$var2 <- c(不适用、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