是否有 R 函数可以将现有指标转换为新的逻辑指标?
Is there an R function that can convert a existing metric into a new logical metric?
我有一个数据集来自口袋妖怪统计数据,其中包含大量数值和分类数据。我的最终目标是创建一个模型或推荐系统,用户可以输入一个 Pokemon 列表,该模型会找到他们可能喜欢的类似 Pokemon。目前数据集看起来像这样:
ID Name Type1 Type2 HP
001 Bulba.. Grass Poison 45
ect...
我知道 type1/type2 指标可能有问题,是否有一个函数可以让我创建一个新的 create/modify 新列,如果 Pokemon 具有特定类型,它会添加一个逻辑值(0 表示错误,1 表示正确)在那个新列中?
对于缺乏光彩的解释我深表歉意,但我想要的是我的数据集看起来像这样:
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)
过滤掉行,因为这意味着口袋妖怪没有第二种类型。我们创建一个指示变量——它得到一个 1。然后每个 pokemon 将有 indicator == 1
作为它拥有的类型。我们删除现在无关的 "name" 列,并使用 pivot_wider()
将 value
中的每个唯一值转换为它自己的列,该列将接收 indicator
的值作为单元格值对于每一行。最后,我们对所有数字列进行变异,以用 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
我有一个数据集来自口袋妖怪统计数据,其中包含大量数值和分类数据。我的最终目标是创建一个模型或推荐系统,用户可以输入一个 Pokemon 列表,该模型会找到他们可能喜欢的类似 Pokemon。目前数据集看起来像这样:
ID Name Type1 Type2 HP
001 Bulba.. Grass Poison 45
ect...
我知道 type1/type2 指标可能有问题,是否有一个函数可以让我创建一个新的 create/modify 新列,如果 Pokemon 具有特定类型,它会添加一个逻辑值(0 表示错误,1 表示正确)在那个新列中?
对于缺乏光彩的解释我深表歉意,但我想要的是我的数据集看起来像这样:
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)
过滤掉行,因为这意味着口袋妖怪没有第二种类型。我们创建一个指示变量——它得到一个 1。然后每个 pokemon 将有 indicator == 1
作为它拥有的类型。我们删除现在无关的 "name" 列,并使用 pivot_wider()
将 value
中的每个唯一值转换为它自己的列,该列将接收 indicator
的值作为单元格值对于每一行。最后,我们对所有数字列进行变异,以用 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