R: Создание фиктивных переменных для значений одной переменной, условно другой переменной

ОРИГИНАЛЬНЫЙ ВОПРОС

Я хочу добавить ряд фиктивных переменных в фрейм данных для каждого значения 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.
  • вар3 и т. д.

Я не могу понять, как это векторизовать. Я ищу решение, которое можно использовать для большого количества значений х.

ОБНОВИТЬ

Был некоторый беспорядок, что я хотел перебрать каждый индекс х. Я не ищу это, а скорее решение, которое создает переменную для каждого уникального значения х. Принимая следующие данные в качестве входных данных:

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

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
Другие вопросы по тегам