是否有一个R函数可以将现有度量转换为新的逻辑度量



我有一个从口袋妖怪统计数据中派生的数据集,其中包含许多数字和分类数据。我的最终目标是创建一个模型或推荐系统,用户可以输入口袋妖怪的列表,该模型可以找到他们可能喜欢的类似口袋妖怪。目前数据集看起来像这样:

ID   Name    Type1    Type2   HP 
001  Bulba.. Grass    Poison  45
ect...

我知道type1/type2度量可能有问题,有没有一个函数可以让我创建一个新的创建/修改新列?如果口袋妖怪有一个特定的类型,它会在新列中添加一个逻辑值(0表示false,1表示true(?

我为缺乏光彩的解释道歉,但我想要的是我的数据集看起来像这样:

ID   Name    Grass  Poison Water  HP 
001  Bulba..    1      1     0    45
ect...

tidyr是一个用于数据整形的包。在这里,我们将使用pivot_longer()将其放入一个长格式中,其中类型名称(Type1、Type2(将位于"name"列中,而值(Grass、Poison等(则位于"value"列中。我们用is.na(value)过滤掉行,因为这意味着pokemon没有第二种类型。我们创建了一个指示符变量——它得到一个1。然后,每个pokemon都将为其所拥有的类型拥有indicator == 1。我们去掉现在无关的"name"列,并使用pivot_wider()value中的每个唯一值转换为自己的列,该列将接收indicator的值作为每行的单元格值。最后,我们对所有数字列进行变异,将missing替换为0,因为我们知道这些pokemon不是那些类型。比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), 0, 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

最新更新