2016-12-08 2 views
0

У меня есть dataframe «домашние животные», который выглядит так:Как использовать значения в списке для динамического создания столбцов в фрейме данных с использованием каждого значения в R?

PERSON | WEEK  | CAT | DOG | BIRD 
------------------------------------------------ 
000001 | 2016-08-29 | CAT | 0 | 0 
000002 | 2016-07-25 | 0 | DOG | BIRD 

И в настоящее время у меня есть код, который заменяет все экземпляры «САТ», «DOG» и «птица» в соответствующих столбцах с 1 :

pets$cat <- ifelse(pets$cat== "cat", 1, 0) 
pets$dog <- ifelse(pets$dog== "dog", 1, 0) 
pets$bird <- ifelse(pets$bird== "bird", 1, 0) 

Что я ищу сделать, это использовать уже определенный список, чтобы сделать весь этот процесс менее руководство, когда один день, я добавляю новую колонку под названием «LIZARD». Список, который я могу просто обновить любые изменения:

animals <- c("cat","dog","bird") 

Есть ли способ в R, чтобы использовать этот список в основном запустить цикл, который делает «для каждого элемента в животных, запустить pet$item<- ifelse(pets$item== "item", 1, 0)»?

Очень ценю помощь. Не удалось найти похожие вопросы.

+5

'домашних животных [, животные] <- + (домашние животные [, животные] = 0!)' Являются столбцы только 0s и имя столбца или есть другие метки, кроме "0" и "САТ" в Например, колонка «CAT»? – rawr

+1

@rawr Может быть, сравнение должно быть '! =" 0 "'? – lmo

+2

@lmo 'all (factor (0) == 0, factor ('0') == 0, '0' == 0)' – rawr

ответ

0

Используя tidyr, вы можете собрать данные, отрегулировать столбец, а затем распространить его обратно. Это использует идею о том, что ваши первые 2 столбца не являются животными, а не вектором животных.

df %>% 
    gather(animal, value, -PERSON, -WEEK) %>% 
    mutate(value = ifelse(value == animal, 1, 0)) %>% 
    spread(animal, value) 
Смежные вопросы