【问题标题】:How do I use values in a list to dynamically create columns in a dataframe using each value in R?如何使用列表中的值使用 R 中的每个值在数据框中动态创建列?
【发布时间】:2016-12-08 16:35:37
【问题描述】:

我有一个如下所示的数据框“宠物”:

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

目前我的代码可以用 1 替换相应列中“CAT”、“DOG”和“BIRD”的任何实例:

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&lt;- ifelse(pets$item== "item", 1, 0)

非常感谢您的帮助。找不到任何类似的问题。

【问题讨论】:

  • pets[, animals] &lt;- +(pets[, animals] != 0)是只有0的列和列名还是“CAT”列中除了“0”和“CAT”之外还有其他标签?
  • @rawr 比较应该是!= "0"
  • @lmo all(factor(0) == 0, factor('0') == 0, '0' == 0)
  • @rawr 感谢您的澄清。因素是一头奇怪的野兽。
  • @rawr 哦,太好了!当我将 0 放在“”中时,效果很好。为了澄清,我只有 0 的实例和每列中的列名。太感谢了!我从您的简单回答中学到了一些新技术。

标签: r list dataframe


【解决方案1】:

使用tidyr,您可以收集数据,调整列然后将其展开。这使用了您的前 2 列不是动物而不是动物向量的想法。

df %>% 
   gather(animal, value, -PERSON, -WEEK) %>% 
   mutate(value = ifelse(value == animal, 1, 0)) %>% 
   spread(animal, value)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多