如何重塑垂直 table
How to reshape vertical table
我想用患者信息重塑 table。我尝试了 base R 的 xtabs
和 reshape2 的 acast
,但无法得到结果。我的 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
如您所见,有些患者可能接受了手术,有些则没有,在这种情况下,甚至没有在患者姓名下提及。而id0021和0154旁边的数字是总数量和该患者的总价,新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
我想用患者信息重塑 table。我尝试了 base R 的 xtabs
和 reshape2 的 acast
,但无法得到结果。我的 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 |
如您所见,有些患者可能接受了手术,有些则没有,在这种情况下,甚至没有在患者姓名下提及。而id0021和0154旁边的数字是总数量和该患者的总价,新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