我正在尝试转换包含以下列的宽数据框:
id, age, gender, AAA1, value11, AAA2, value12, ..., BBB1, value21, BBB2, value22, ..., CCC1, value31, CCC2, value32,...
到
id, age, gender,
type = AAA, BBB, CCC, ...
stage = * where AAA*, BBB*, CCC*, ...
period = ** where value**
value = actual values under value11, value12, ...., value21, value22, ...
我似乎找不到使用 dplyr 来执行此操作的好方法。感谢对此的任何帮助。
没有任何数据,很难知道数据帧的真正格式是什么。话虽这么说,我想象
XXX##
只是该名称的字符串?给定您想要的输出,看起来所有类型信息都保存在 value##
列名称中,因此我们可能只需删除 XXX##
列,pivot_longer
并在之后导出类型数据。
library(tidyverse)
#test data
set.seed(25)
example_data <- tibble(id = letters[1:5],
age = 21:25,
gender = "m",
AAA1 = "AAA1",
value11 = runif(5),
AAA2 = "AAA2",
value12 = runif(5),
BBB1 = "BBB1",
value21 = runif(5),
BBB2 = "BBB2",
value22 = runif(5),
)
example_data
#> # A tibble: 5 x 11
#> id age gender AAA1 value11 AAA2 value12 BBB1 value21 BBB2 value22
#> <chr> <int> <chr> <chr> <dbl> <chr> <dbl> <chr> <dbl> <chr> <dbl>
#> 1 a 21 m AAA1 0.416 AAA2 0.985 BBB1 0.328 BBB2 0.148
#> 2 b 22 m AAA1 0.695 AAA2 0.626 BBB1 0.364 BBB2 0.540
#> 3 c 23 m AAA1 0.149 AAA2 0.338 BBB1 0.959 BBB2 0.728
#> 4 d 24 m AAA1 0.897 AAA2 0.0668 BBB1 0.589 BBB2 0.477
#> 5 e 25 m AAA1 0.124 AAA2 0.282 BBB1 0.695 BBB2 0.729
#solution
example_data |>
select(id, age, gender, contains("value")) |>
pivot_longer(cols = contains("value"),
names_to = c("stage", "period"),
values_to = "value",
names_pattern = "value(.)(.)",
names_transform = as.numeric) |>
mutate(type = map_chr(stage, \(x) paste(rep(LETTERS[x], 3), collapse = "" )),
.after = gender)
#> # A tibble: 20 x 7
#> id age gender type stage period value
#> <chr> <int> <chr> <chr> <dbl> <dbl> <dbl>
#> 1 a 21 m AAA 1 1 0.416
#> 2 a 21 m AAA 1 2 0.985
#> 3 a 21 m BBB 2 1 0.328
#> 4 a 21 m BBB 2 2 0.148
#> 5 b 22 m AAA 1 1 0.695
#> 6 b 22 m AAA 1 2 0.626
#> 7 b 22 m BBB 2 1 0.364
#> 8 b 22 m BBB 2 2 0.540
#> 9 c 23 m AAA 1 1 0.149
#> 10 c 23 m AAA 1 2 0.338
#> 11 c 23 m BBB 2 1 0.959
#> 12 c 23 m BBB 2 2 0.728
#> 13 d 24 m AAA 1 1 0.897
#> 14 d 24 m AAA 1 2 0.0668
#> 15 d 24 m BBB 2 1 0.589
#> 16 d 24 m BBB 2 2 0.477
#> 17 e 25 m AAA 1 1 0.124
#> 18 e 25 m AAA 1 2 0.282
#> 19 e 25 m BBB 2 1 0.695
#> 20 e 25 m BBB 2 2 0.729