首页 > 解决方案 > 使用通用名称重新排序列 - dplyr

问题描述

我的数据来自一个数据库,根据我运行 SQL 查询的时间,该数据库可能包含从一周到另一周的不同 POS 值。

不知道变量中将包含哪些值使得自动创建报告变得非常困难。

我的数据如下所示:

sample <- data.frame(DRUG = c("A","A","B"),POS = c("Hospital","Physician","Home"),GROSS_COST = c(50,100,60), NET_COST = c(45,80,40))

在此处输入图像描述

我需要更广泛地旋转这个数据框,以便每个 pos 按成本(总和净)有一列。

这可以使用 pivot_wider 轻松实现:

x <- sample %>% pivot_wider(names_from = POS, values_from = c(GROSS_COST,NET_COST))

在此处输入图像描述

目标 我希望能够将每个 POS 的列保持在一起,即 GROSS_COST_Hospital 和 NET_COST_Hospital 将并排,与所有其他 POS 列类似。

有没有一种优雅的方法来使用字符串匹配对列进行分组?

标签: rdplyrdata-manipulation

解决方案


我们可以在select步骤上订购

library(dplyr)
library(tidyr)
library(stringr)
sample %>% 
  pivot_wider(names_from = POS, values_from = c(GROSS_COST,NET_COST)) %>% 
  select(DRUG, names(.)[-1][order(str_extract(names(.)[-1], '[^_]+$'))])
# A tibble: 2 x 7
#  DRUG  GROSS_COST_Home NET_COST_Home GROSS_COST_Hospital NET_COST_Hospital GROSS_COST_Physician NET_COST_Physician
#  <chr>           <dbl>         <dbl>               <dbl>             <dbl>                <dbl>              <dbl>
#1 A                  NA            NA                  50                45                  100                 80
#2 B                  60            40                  NA                NA                   NA                 NA

推荐阅读