【问题标题】:Reshape wide to long, multiple columns and multiple time periods重塑宽到长,多列和多个时间段的问题
【发布时间】:2022-08-04 14:48:53
【问题描述】:
我试图从宽到长重塑数据,但我无法得到答案。结构如下:
| id |
n_dep_1 |
n_dep_2 |
bleed_1 |
bleed_2 |
secretion_1 |
secretion_2 |
eva_1 |
eva_2 |
| 1 |
1 |
2 |
1 |
1 |
1 |
1 |
9 |
7 |
| 2 |
2 |
1 |
0 |
1 |
1 |
0 |
5 |
6 |
| 3 |
2 |
1 |
1 |
0 |
1 |
1 |
7 |
5 |
注意:我对每个关键变量 \"n_dep\"、\"bleed\"、\"secretion\" 和 \"eva\" 进行了 14 次测量。
我需要这样的东西:
| id |
n_dep |
bleed |
secretion |
eva |
| 1 |
1 |
1 |
1 |
9 |
| 1 |
2 |
1 |
1 |
7 |
| 2 |
2 |
0 |
1 |
5 |
| 2 |
1 |
1 |
0 |
6 |
| 3 |
2 |
1 |
1 |
7 |
| 3 |
1 |
0 |
1 |
5 |
我试过这个:
require(data.table)
melt(setDT(data_wide), id=\"id\",
measure=patterns(\"n_dep_$\", \"eva_$\", \"bleed_$\",\"secretion_$\"),
value.name=c(\"n_dep\", \"eva\", \"bleed\",\"secretion\"))
我得到了这个错误:
do_patterns(measure.sub, names(data)) 中的错误:
未找到模式:[n_dep_$、eva_$、bleed_$、secrement_$]
我也尝试过重塑和聚集,但我无法让它发挥作用。
请帮忙。
标签:
r
tidyr
reshape
gather
【解决方案1】:
它不是 data.table,但使用 tidyverse 你可以这样做:
library(tidyverse)
d |>
gather("var", "val", -id) |>
mutate(id2 = str_extract(var, "\\d$"),
var = str_remove(var, "_\\d$")) |>
spread(var, val)
#> # A tibble: 6 × 6
#> id id2 bleed eva n_dep secretion
#> <dbl> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 1 1 1 9 1 1
#> 2 1 2 1 7 2 1
#> 3 2 1 0 5 2 1
#> 4 2 2 1 6 1 0
#> 5 3 1 1 7 2 1
#> 6 3 2 0 5 1 1
由reprex package (v2.0.1) 于 2022 年 3 月 28 日创建
【解决方案2】:
更简单的方法是从tidyr 调用pivot_longer:
tidyr::pivot_longer(data_wide, -id, names_pattern = '(^.*)_', names_to = ".value")
#> # A tibble: 6 x 5
#> id n_dep bleed secretion eva
#> <int> <int> <int> <int> <int>
#> 1 1 1 1 1 9
#> 2 1 2 1 1 7
#> 3 2 2 0 1 5
#> 4 2 1 1 0 6
#> 5 3 2 1 1 7
#> 6 3 1 0 1 5
【解决方案3】:
模式中的正则表达式与列名不匹配。
您当前指定如下,例如“n_dep_$”可能期望匹配 n_dep_1、n_dep_2 等。正则表达式要求以下划线结尾且后面没有数字的列名,因为 $ 标记结束的输入。
do_patterns 正在返回错误,因为列名中的正则表达式不匹配。
请尝试:
melt(setDT(data_wide), id="id",
measure=patterns("^n_dep_\\d+$", "^eva_\\d+$", "^bleed_\\d+$","^secretion_\\d+$"),
value.name=c("n_dep", "eva", "bleed","secretion"))
这 ^ 表示输入的开始,而 $ 表示输入的结束。所以在这里,^n_dep_\\d+$ 请求以“n_dep_”开头并以一位(或多位)数字结尾的列。