如何将含常量列的tibble重塑为单行?pivot_wider使用求助
解决思路
你可以通过先转长再转宽的两步操作实现需求,核心是先把n和max列拆成键值对,再将id与键名拼接成新列名,具体步骤如下:
步骤1:将宽格式转为长格式
先用pivot_longer把n、max这两列转为长格式,生成包含var(原列名)和val(对应值)的新列,同时保留id、class、Time列:
library(tidyr) library(dplyr) df_long <- df %>% pivot_longer(cols = c(n, max), names_to = "var", values_to = "val")
转换后df_long的结构是:
# A tibble: 6 × 5 id class Time var val <dbl> <dbl> <dbl> <chr> <dbl> 1 1 0 1 n 1 2 1 0 1 max -10 3 2 0 1 n 2 4 2 0 1 max 2 5 3 0 1 n 1 6 3 0 1 max 3
步骤2:拼接列名并转宽格式
接下来用unite把id和var列拼接成新的列名,再用pivot_wider转成目标宽格式:
df_wide <- df_long %>% unite(col = "new_col", id, var, sep = "_") %>% pivot_wider(names_from = new_col, values_from = val)
运行后得到的结果就是你要的单行结构:
# A tibble: 1 × 7 class Time `1_n` `1_max` `2_n` `2_max` `3_n` `3_max` <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 0 1 1 -10 2 2 1 3
简化版(一步完成)
也可以把两步合并成一条链式操作,更简洁:
df_final <- df %>% pivot_longer(cols = c(n, max), names_to = "var", values_to = "val") %>% unite(new_col, id, var, sep = "_") %>% pivot_wider(names_from = new_col, values_from = val)
内容的提问来源于stack exchange,提问作者Ai4l2s
相关产品推荐
相关产品推荐

