如何重塑垂直 table

How to reshape vertical table

我想用患者信息重塑 table。我尝试了 base Rxtabsreshape2acast,但无法得到结果。我的 table 看起来像这样:

var1 id 数量 价格
患者姓名 1 0021 7.0 167.3
毒品 不适用 3.0 15.8
医疗产品 不适用 1.0 150.0
解决方案 不适用 3.0 4.5
患者姓名 2 0154 11.0 792.0
毒品 不适用 7.0 37.4
手术材料 不适用 4.0 754.6

如您所见,有些患者可能接受了手术,有些则没有,在这种情况下,甚至没有在患者姓名下提及。而id00210154旁边的数字是总数量该患者的总价,新table 中不需要此信息。我认为以后可以很容易地计算总数。最后的 table 应该是这样的:

ID 药品价格 医疗产品价格 解决方案价格 手术材料价格 药品数量(等)
0021 15.8 150.0 4.5 0 3.0
0154 37.4 0 0 754.6 7.0

因此,该函数必须用 0 填充遗漏的变量,并且必须是垂直的。

您可以 fill id 值并以宽格式获取数据。

library(dplyr)
library(tidyr)

df %>%
  fill(id) %>%
  pivot_wider(names_from = var1, values_from = c(quantity, price), values_fill = 0)
library(dplyr)
library(tidyr)

df %>% 
  fill(id) %>% 
  filter(var1 %in% c("Drugs", "Medical products", "Solutions", "Surgical materials")) %>% 
  pivot_wider(names_from = var1, 
              values_from = c(price, quantity), 
              names_glue = "{var1} {.value}",
              values_fill = 0) %>% 
  mutate(id = sprintf("%04d", id))

这给了我们:

# A tibble: 2 x 9
  id    `Drugs price` `Medical products p~ `Solutions price` `Surgical materials ~ `Drugs quantity` `Medical products q~ `Solutions quant~ `Surgical materials ~
  <chr>         <dbl>                <dbl>             <dbl>                 <dbl>            <dbl>                <dbl>             <dbl>                 <dbl>
1 0021           15.8                  150               4.5                    0                 3                    1                 3                     0
2 0154           37.4                    0               0                    755.                7                    0                 0                     4