Один из возможных способов - использовать unnest_wider()
в tidyr
. Когда это не указано, имя элемента списка будет автоматически использоваться в качестве имени столбца.
Я считаю, что есть лучший способ построения списка records
, но в настоящее время это лучшее, что я могу придумать.
library(dplyr)
library(tidyr)
df1 <- df %>%
group_by(M) %>%
# convert column X and Z to a list column with each element named as
# X_1,X_2,... and Z_1,Z_2, ...
summarise(records = list(
append(
as.list(X) %>% setNames(paste0("X_",seq_along(X))),
as.list(Z) %>% setNames(paste0("Z_",seq_along(Z)))
))
) %>%
# when unnested, the name for a list element will be automated applied the the column name
unnest_wider(records)
> df1
# A tibble: 5 x 7
M X_1 X_2 X_3 Z_1 Z_2 Z_3
<chr> <int> <int> <int> <chr> <chr> <chr>
1 bam 12 14 10 B1 B4 B6
2 kar 13 17 NA B5 B1 NA
3 mmn 13 12 NA B7 B12 NA
4 sdr 11 NA NA B3 NA NA
5 zar 11 NA NA B8 NA NA