我有一个数据框“宠物”,如下所示:
PERSON | WEEK | CAT | DOG | BIRD
------------------------------------------------
000001 | 2016-08-29 | CAT | 0 | 0
000002 | 2016-07-25 | 0 | DOG | BIRD
目前我的代码用适当的列替换“CAT”,“DOG”和“BIRD”的任何实例,并带有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)
”?
非常感谢帮助。无法找到任何类似的问题。
答案 0 :(得分:0)
使用tidyr
您可以收集数据,调整列然后再将其展开。这使用了前两列不是动物而不是动物载体的想法。
df %>%
gather(animal, value, -PERSON, -WEEK) %>%
mutate(value = ifelse(value == animal, 1, 0)) %>%
spread(animal, value)