我错过了一些更巧妙的方法吗?使用来自 NHSDataDictionaRy 的 tibble 重构 tibble

Am I missing some slicker way? Re-factoring a tibble using a tibble from NHSDataDictionaRy

所以我需要重新导入数据,我看到 R 已经发布了 NHS 数据字典包,所以我想我可以用它来将性别列中的 1 和 2 映射到更有用的命名因子(即男性和女性),我永远不记得哪个是哪个,所以他们肯定需要分类。

我的示例数据集:

gender age
1 40
2 43
2 56
1 72
9 34

使用新包从 NHS 数据字典获取数据非常简单 - 如果输入有点繁重...

连接我的数据很容易,但在这种情况下 'feels' 方法不对。

require(dplyr)
require(forcats)
require(NHSDataDictionaRy)

myData <- tibble ( gender = as.factor(c("1","2","2","1", "9")), 
                   age = c(40,43,56,72,34)
                   )

nhs_data_lookup <- nhs_data_elements()

tableR(nhs_data_lookup$full_url[nhs_data_lookup$link_name == "PERSON STATED GENDER CODE"], 
       nhs_data_lookup$xpath_nat_code[nhs_data_lookup$link_name == "PERSON STATED GENDER CODE"] ) %>%
    select(Code, Description) -> genderLookup

set_names( genderLookup$Code, genderLookup$Description) -> genderLookup

myData %>%
    mutate(gender = fct_recode(gender, !!!genderLookup))

给出:

gender age
Male 40
Female 43
Female 56
Male 72
Indeterminate (unable to be classified as either male or female) 34

以上作品。但是它的机器人丑陋的代码!

1. Lookup 可以更简洁。也许它只是需要我写一个函数?

NHStableR <- function(link_name) {
    nhs_data_lookup <- nhs_data_elements()
    tableR(nhs_data_lookup$full_url[nhs_data_lookup$link_name == link_name], 
           nhs_data_lookup$xpath_nat_code[nhs_data_lookup$link_name == link_name] ) %>%
        select(Code, Description) 
}

NHStableR("PERSON STATED GENDER CODE")

想知道是否应该将其作为更新提出?

但后来...

2。分解 保存到一个对象,'flattening' 将对象放入一个命名列表,然后用它重新编码因子感觉非常'non-tidyverse'

那么函数的命名元素版本会更好吗? 我是否完成了我看起来非常擅长的事情 - 并创建了 3 个步骤,而我本可以输入 doSomeMagicThing(Gender) 并对其进行排序?

NHSnameR <- function(link_name) {
    nhs_data_lookup <- nhs_data_elements()
    tableR(nhs_data_lookup$full_url[nhs_data_lookup$link_name == link_name], 
           nhs_data_lookup$xpath_nat_code[nhs_data_lookup$link_name == link_name] ) %>%
        select(Code, Description) -> x
    set_names( x$Code, x$Description)
}

myData %>%
    mutate(gender = fct_recode(gender, !!!NHSnameR("PERSON STATED GENDER CODE")))

可能是我不太了解数据字典,不知道这是否可行?

所以: 1. 我是不是错过了一些更整洁的东西(双关语!)

2. 如果没有,那么有人对此有想法吗?我意识到这有点小众!

3. 也许是最简单的 - 如果字典有数据中没有的选项(比如我的数据中没有未知性别) - 它会生成警告。可以压制吗?

4. 正在对代码中的数据进行 HTTP 查找,这样不好

添加到开发版本的新功能现在提供这些功能。

NHStableR( "PERSON STATED GENDER CODE" )
tableRtoNamedList ( "PERSON STATED GENDER CODE", table_method = "NHStableR" )