2017-01-20 2 views
0

У меня есть набор данных, который выглядит следующим образом:г: динамический кадр данных зацикливание

own_cc.1 own_cc.2 own_cc.3 own_cc.4 own_cc.5 own_cc.6 own_cc.7 
1   1  0  1  0  1  0  0 
2   1  NA  1  1  1  1  NA 
3   0  0  1  0  0  0  0 
4   1  0  NA  0  1  NA  NA 
5   1  0  1  1  0  0  0 
6   0  0  0  0  0  1  0 
7   1  0  0  0  0  0  0 
8   1  1  0  0  0  0  1 
9   0  0  1  0  0  0  0 
10  0  0  0  0  0  1  0 

И что я хотел бы сделать, это создать новую переменную для каждой комбинации own_cc.1 и других переменных. Таким образом, функция r_own_2 <- ifelse(own_cc.1==0 own_cc.2==1,1,0), и она должна просто выключить r_own_ и own_cc.2.

Я попытался сделать это с помощью цикла, но это не работает:

for(i in 2:7) { 
    nam <- paste("r_own_", i, sep = "") 
    w[nam] <- NA 
    w[nam] <- with(w, ifelse(own_cc.1==0 & get(nam)==1,1,0)) 
} 

Есть ли способ сделать это с петлей? Должен ли я использовать список? Если да, можете ли вы любезно предоставить подробные инструкции, поскольку списки относительно новы для меня?

ответ

1

Мы можем сделать это без использования ifelse и без части get. Как paste является векторизация функция, мы можем создать «NAM» вне цикла

nam <- paste0("r_own_", 2:7) 

Затем цикл по столбцам «ш», кроме 1-го, сравнить логические векторы (w[,1]==0) с x==1, принуждать его в двоичную с as.integer и назначить list выход, чтобы создать новые столбцы, указанные в «Нама»

w[nam] <- lapply(w[-1], function(x) as.integer((w[,1]==0) & (x==1))) 
+1

ОК, что является блестящим! – vashts85

Смежные вопросы