tidyr是用于数据重塑的软件包。在这里,我们将使用pivot_longer()
将其设置为长格式,其中类型名称(Type1,Type2)将位于“名称”列中,而值(Grass,Poison等)将位于列“值”。我们
用is.na(value)
过滤掉行,因为这意味着口袋妖怪没有第二种类型。我们创建一个指示变量-它得到一个1。然后,每个宠物小精灵的类型都会有indicator == 1
。我们删除现在无关的“名称”列,并使用pivot_wider()
将value
中的每个唯一值转换为它自己的列,该列将接收indicator
的值作为每个单元格的值行。最后,我们对所有数字列进行突变以用0替换缺失,因为我们知道那些神奇宝贝不是那些类型。
比mutate_if(is.numeric,...)
更好的解决方案是计算类型的唯一值并使用mutate_at(vars(pokemon_types),...
。这不会无意中影响其他数字列。
library(tidyr)
library(dplyr)
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter,lag
#> The following objects are masked from 'package:base':
#>
#> intersect,setdiff,setequal,union
pokemon <- tibble(ID = c(1,2),Name = c("Bulbasaur","Squirtle"),Type1 = c("Grass","Water"),Type2 = c("Poison",NA),HP = c(40,50))
pokemon %>% pivot_longer(
starts_with("Type")
) %>%
filter(!is.na(value)) %>%
mutate(indicator = 1) %>%
select(-name) %>%
pivot_wider(names_from = value,values_from = indicator,) %>%
mutate_if(is.numeric,.funs = function(x) if_else(is.na(x),x))
#> # A tibble: 2 x 6
#> ID Name HP Grass Poison Water
#> <dbl> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 1 Bulbasaur 40 1 1 0
#> 2 2 Squirtle 50 0 0 1
本文链接:https://www.f2er.com/3131888.html