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