使用R访问美国国家提供商标识符(NPI)注册表API(v2.1),由Medicare和Medicaid Services中心(CMS):https://npiregistry.cms.hhhs.gov/。获取链接到特定个人或组织医疗保健提供商的丰富管理数据,或根据提供商名称,位置,服务类型,凭据和许多其他属性进行高级搜索。 npi
为数据提取提供了便利功能,因此您可以花更少的时间来争吵数据,而更多的时间将数据投入工作。
使用医疗保健和公共卫生数据的分析师经常需要加入多个来源的数据以回答其业务或研究问题。不幸的是,在医疗保健中加入数据很难,因为很少有实体在组织边界之间具有独特的,一致的标识符。但是,NPI数字不会受到这些限制的困扰,因为所有符合某些常见标准的美国提供商都必须具有NPI编号,才能为其提供的服务报销。这使得NPI数字对于加入提供商的多个数据集非常有用,提供商是开发此软件包的主要动机。
有三种安装npi
软件包的方法:
install.packages( " npi " )
library( npi )
install.packages( " npi " , repos = " https://ropensci.r-universe.dev " )
library( npi )
devtools
软件包从GitHub安装: devtools :: install_github( " ropensci/npi " )
library( npi )
npi
导出四个功能,所有功能都匹配模式“ npi_*”:
npi_search()
:搜索NPI注册表,并将响应返回,将其返回,将高心态数据组织到列表列中。npi_summarize()
:一种显示npi_search()
结果概述的方法。npi_flatten()
:一种通过NPI编号连接的搜索结果中一个或多个列表列的方法。npi_is_valid()
:使用官方的NPI枚举标准检查一个或多个NPI编号的有效性。npi_search()
几乎公开了NPPE API的所有搜索参数。假设我们想在纽约市找到多达10个拥有主要地点的提供商:
nyc <- npi_search( city = " New York City " )
# Your results may differ since the data in the NPPES database changes over time
nyc
# > # A tibble: 10 × 11
# > npi enume…¹ basic other_…² identi…³ taxono…⁴ addres…⁵ practi…⁶ endpoi…⁷
# > * <int> <chr> <list> <list> <list> <list> <list> <list> <list>
# > 1 1.19e9 Indivi… <tibble> <tibble> <tibble> <tibble> <tibble> <tibble> <tibble>
# > 2 1.31e9 Indivi… <tibble> <tibble> <tibble> <tibble> <tibble> <tibble> <tibble>
# > 3 1.64e9 Indivi… <tibble> <tibble> <tibble> <tibble> <tibble> <tibble> <tibble>
# > 4 1.35e9 Indivi… <tibble> <tibble> <tibble> <tibble> <tibble> <tibble> <tibble>
# > 5 1.56e9 Indivi… <tibble> <tibble> <tibble> <tibble> <tibble> <tibble> <tibble>
# > 6 1.79e9 Indivi… <tibble> <tibble> <tibble> <tibble> <tibble> <tibble> <tibble>
# > 7 1.56e9 Indivi… <tibble> <tibble> <tibble> <tibble> <tibble> <tibble> <tibble>
# > 8 1.96e9 Organi… <tibble> <tibble> <tibble> <tibble> <tibble> <tibble> <tibble>
# > 9 1.43e9 Indivi… <tibble> <tibble> <tibble> <tibble> <tibble> <tibble> <tibble>
# > 10 1.33e9 Indivi… <tibble> <tibble> <tibble> <tibble> <tibble> <tibble> <tibble>
# > # … with 2 more variables: created_date <dttm>, last_updated_date <dttm>, and
# > # abbreviated variable names ¹enumeration_type, ²other_names, ³identifiers,
# > # ⁴taxonomies, ⁵addresses, ⁶practice_locations, ⁷endpoints
完整的搜索结果有四个常规向量列, npi
, enumeration_type
, created_date
和last_updated_date
和七个列表列。每个列表列是相关数据的集合:
basic
:有关提供商的基本个人资料信息other_names
:提供商使用的其他名称identifiers
:其他提供商标识符和凭据信息taxonomies
:服务分类和许可信息addresses
:位置和邮寄地址信息practice_locations
:提供者的练习位置endpoints
:有关提供商的健康信息交换终点的详细信息这些列表列中可能字段的完整列表可以在NPPE API帮助页面上找到。
如果您愿意使用列表列,则可能是包装中所需的全部。但是, npi
还提供了可以帮助您汇总和改变搜索结果的功能。
npi
具有两个主要的助手功能,用于处理搜索结果: npi_summarize()
和npi_flatten()
。
在结果上运行npi_summarize()
以查看您搜索结果的更可读的概述。具体而言,该功能返回NPI号,提供商的姓名,枚举类型(个人或组织提供者),主要地址,电话号码和主要分类法(实践领域):
npi_summarize( nyc )
# > # A tibble: 10 × 6
# > npi name enume…¹ prima…² phone prima…³
# > <int> <chr> <chr> <chr> <chr> <chr>
# > 1 1194276360 ALYSSA COWNAN Indivi… 5 E 98… 212-… Physic…
# > 2 1306849641 MARK MOHRMANN Indivi… 16 PAR… 212-… Orthop…
# > 3 1639173065 SAKSHI DUA Indivi… 10 E 1… 212-… Nurse …
# > 4 1346604592 SARAH LOWRY Indivi… 1335 D… 614-… Occupa…
# > 5 1558362566 AMY TIERSTEN Indivi… 1176 5… 212-… Psychi…
# > 6 1790786416 NOAH GOLDMAN Indivi… 140 BE… 973-… Intern…
# > 7 1558713628 ROBYN NOHLING Indivi… 9 HOPE… 781-… Nurse …
# > 8 1962983775 LENOX HILL MEDICAL ANESTHESIOLOGY, … Organi… 100 E … 212-… Intern…
# > 9 1427454529 YONGHONG TAN Indivi… 34 MAP… 203-… Obstet…
# > 10 1326403213 RAJEE KRAUSE Indivi… 12401 … 347-… Nurse …
# > # … with abbreviated variable names ¹enumeration_type,
# > # ²primary_practice_address, ³primary_taxonomy
如上所述, npi_search()
返回的数据框具有嵌套结构。尽管单行中的所有数据都与一个NPI相关,但每个列表列包含一个或多个值对应于该行NPI的值的列表。例如,提供商的NPI记录可能具有多个关联的地址,电话号码,分类法和其他属性,所有这些都活在数据框架的同一行中。
由于嵌套结构可能有些棘手,因此npi
包含npi_flatten()
,该功能将数据框架转换为更易于使用(即,未打开和合并)结构,更易于使用。 npi_flatten()
执行以下转换:
npi_flatten()
支持各种方法来平移npi_search()
的结果。一个极端是立即弄平一切:
npi_flatten( nyc )
# > # A tibble: 48 × 42
# > npi basic_fi…¹ basic…² basic…³ basic…⁴ basic…⁵ basic…⁶ basic…⁷ basic…⁸
# > <int> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
# > 1 1194276360 ALYSSA COWNAN PA NO F 2016-1… 2018-0… A
# > 2 1194276360 ALYSSA COWNAN PA NO F 2016-1… 2018-0… A
# > 3 1306849641 MARK MOHRMA… MD NO M 2005-0… 2019-0… A
# > 4 1306849641 MARK MOHRMA… MD NO M 2005-0… 2019-0… A
# > 5 1306849641 MARK MOHRMA… MD NO M 2005-0… 2019-0… A
# > 6 1306849641 MARK MOHRMA… MD NO M 2005-0… 2019-0… A
# > 7 1326403213 RAJEE KRAUSE AGPCNP… NO F 2015-1… 2019-0… A
# > 8 1326403213 RAJEE KRAUSE AGPCNP… NO F 2015-1… 2019-0… A
# > 9 1326403213 RAJEE KRAUSE AGPCNP… NO F 2015-1… 2019-0… A
# > 10 1326403213 RAJEE KRAUSE AGPCNP… NO F 2015-1… 2019-0… A
# > # … with 38 more rows, 33 more variables: basic_name <chr>,
# > # basic_name_prefix <chr>, basic_middle_name <chr>,
# > # basic_organization_name <chr>, basic_organizational_subpart <chr>,
# > # basic_authorized_official_credential <chr>,
# > # basic_authorized_official_first_name <chr>,
# > # basic_authorized_official_last_name <chr>,
# > # basic_authorized_official_middle_name <chr>, …
但是,由于字段数量和值的大量值组合,该方法最适合小型数据集。更有可能的是,您需要在一个通过中从原始数据框架中弄平少数列表列,并在事实之后使用所需的其他列表列重复该过程并合并。例如,要使基本提供商和提供商分类信息提交,请将相应的列表列作为名称向量提供给cols
参数:
# Flatten basic provider info and provider taxonomy, preserving the relationship
# of each to NPI number and discarding other list columns.
npi_flatten( nyc , cols = c( " basic " , " taxonomies " ))
# > # A tibble: 20 × 26
# > npi basic_fi…¹ basic…² basic…³ basic…⁴ basic…⁵ basic…⁶ basic…⁷ basic…⁸
# > <int> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
# > 1 1194276360 ALYSSA COWNAN PA NO F 2016-1… 2018-0… A
# > 2 1306849641 MARK MOHRMA… MD NO M 2005-0… 2019-0… A
# > 3 1306849641 MARK MOHRMA… MD NO M 2005-0… 2019-0… A
# > 4 1326403213 RAJEE KRAUSE AGPCNP… NO F 2015-1… 2019-0… A
# > 5 1326403213 RAJEE KRAUSE AGPCNP… NO F 2015-1… 2019-0… A
# > 6 1326403213 RAJEE KRAUSE AGPCNP… NO F 2015-1… 2019-0… A
# > 7 1346604592 SARAH LOWRY OTR/L YES F 2016-0… 2018-0… A
# > 8 1346604592 SARAH LOWRY OTR/L YES F 2016-0… 2018-0… A
# > 9 1427454529 YONGHONG TAN <NA> NO F 2014-1… 2018-1… A
# > 10 1558362566 AMY TIERST… M.D. YES F 2005-0… 2019-0… A
# > 11 1558713628 ROBYN NOHLING FNP-BC… YES F 2016-0… 2018-0… A
# > 12 1558713628 ROBYN NOHLING FNP-BC… YES F 2016-0… 2018-0… A
# > 13 1558713628 ROBYN NOHLING FNP-BC… YES F 2016-0… 2018-0… A
# > 14 1558713628 ROBYN NOHLING FNP-BC… YES F 2016-0… 2018-0… A
# > 15 1558713628 ROBYN NOHLING FNP-BC… YES F 2016-0… 2018-0… A
# > 16 1558713628 ROBYN NOHLING FNP-BC… YES F 2016-0… 2018-0… A
# > 17 1639173065 SAKSHI DUA M.D. YES F 2005-0… 2019-0… A
# > 18 1639173065 SAKSHI DUA M.D. YES F 2005-0… 2019-0… A
# > 19 1790786416 NOAH GOLDMAN M.D. NO M 2005-0… 2018-0… A
# > 20 1962983775 <NA> <NA> <NA> <NA> <NA> 2018-0… 2018-0… A
# > # … with 17 more variables: basic_name <chr>, basic_name_prefix <chr>,
# > # basic_middle_name <chr>, basic_organization_name <chr>,
# > # basic_organizational_subpart <chr>,
# > # basic_authorized_official_credential <chr>,
# > # basic_authorized_official_first_name <chr>,
# > # basic_authorized_official_last_name <chr>,
# > # basic_authorized_official_middle_name <chr>, …
就像信用卡号一样,NPI号可能会在运输中误入歧途或损坏。同样,官方发行的NPI编号具有检查数字以进行错误检查。使用npi_is_valid()
检查您遇到的NPI号是否是有效构造的:
# Validate NPIs
npi_is_valid( 1234567893 )
# > [1] TRUE
npi_is_valid( 1234567898 )
# > [1] FALSE
请注意,此功能不会检查NPI号是激活还是停用(请参见#22)。它仅检查了该数字与NPI规范的一致性。因此,它可以帮助您尽早检测和处理数据质量问题。
用户代理是与API交互的软件来告诉它是谁或什么是提出请求的方式。这有助于API的维护者了解哪些系统正在使用API。默认情况下,当npi
向NPPES API提出请求时,请求标题引用了包装的名称和存储库的URL(例如,'npi/0.2.0(https://github.com/ropensci/npi) ')。如果要设置自定义用户代理,请更新npi_user_agent
选项的值。例如,对于称为“ my_app”的应用程序的1.0.0版,您可以运行以下代码:
options( npi_user_agent = " my_app/1.0.0 " )
npi
有一个网站,其中包含发行说明,所有用户功能的文档,以及显示如何使用软件包的示例。
你发现一个错误吗?我很想在“问题”页面上听到有关它的消息。
请注意,此软件包已发布带有贡献者的行为准则。通过为该项目做出贡献,您同意遵守其条款。
有兴趣学习如何为NPI做出贡献吗?前往撰稿人指南,并感谢您的考虑!
有关最新引用,请参阅包装网站上的作者和引文页面。
麻省理工学院(c)弗兰克·法拉赫(Frank Farach)
该套餐的徽标已根据CC BY-SA 4.0许可,并由Frank Farach和Sam Parmar共同创建。该徽标使用Asclepius杆的图像的修改版和归因于Evanherk GFDL的放大镜。