2016-06-20 7 views
2

оригинальный вопрос

Я хочу, чтобы добавить ряд фиктивных переменных в кадре данных для каждого значения х в этом кадре данных, но, содержащих NA, если это другой переменной является NA. Например, предположим, что у меня есть ниже фрейм данных:Р: Создание фиктивных переменных для значений одной переменной условной на другой переменной

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

Ищу производить:

  • var1, что: г $ var1 == 1, если х == 1, в противном случае, если у = = NA, z $ var1 == NA, else z $ var1 == 0.
  • var2 такое, что: z $ var2 == 1 if x == 2, else if y == NA, z $ var2 == NA , иначе г $ var2 == 0.
  • var3 т.д.

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

UPDATE

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

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

Ищу г $ var1, г $ var2, г $ var3, г $ var9 где г $ var1 < - с (1, 1, NA, 0 , NA) и z $ var2 < - c (NA, 0, 1, 0, NA). Исходное решение дает z $ var1 < - z $ var2 < - c (1,1, NA, 0, NA).

ответ

2

Вы можете использовать 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 

Update:

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 
+0

Не совсем. Значения каждого из var1, var2, var3 и т. Д. Должны быть только {0, 1, NA]. Я предполагаю, что это должно быть ifelse (x == i, 1, ... Кроме того, вы можете объяснить, как здесь работает setNames? Не знаю, зачем мне это нужно. – user3614648

+0

Неплохо смущаю состояние и результаты, см. обновление. 'setNames' - это просто удобный способ настройки имен столбцов. Если вам это не интересно, мы можем удалить его. – Psidom

+0

Обновлено: см. выше. – user3614648