首页 > 解决方案 > 如何使用 sparklyr 将宽数据框列转换为长格式?

问题描述

我有一个包含 id、price1、price2、price3、prob1、prob2、prob3 列的数据框我想将宽格式和价格、prob 列转换为长格式

library(dplyr)
library(data.table)


a <- data.table("id" = c(1,2,4),
                "price1"=c(1.2,2.44,5.6),
                "price2"=c(7.6,8,65),
                "price3"=c(1.2,4.5,7.8),
                "prob1"=c(0.1,0.3,0.5),
                "prob2"=c(0.3,0.35,0.75),
                "prob3"=c(0.18,0.31,0.58))

> a
  id price1 price2 price3 prob1 prob2 prob3
1  1   1.20    7.6    1.2   0.1  0.30  0.18
2  2   2.44    8.0    4.5   0.3  0.35  0.31
3  4   5.60   65.0    7.8   0.5  0.75  0.58

我想将表格转换a

b <- data.table("id"=c(1,1,1,2,2,2,3,3,3),
                "order"=c(1,2,3,1,2,3,1,2,3),
                "price"=c(1.20,7.6,1.2,2.44,8.0,4.5,5.60,65.0,7.8),
                "prob"=c(0.1,0.30,0.18,0.3,0.35,0.31,0.5,0.75,0.58))

> b
   id order price prob
1:  1     1  1.20 0.10
2:  1     2  7.60 0.30
3:  1     3  1.20 0.18
4:  2     1  2.44 0.30
5:  2     2  8.00 0.35
6:  2     3  4.50 0.31
7:  3     1  5.60 0.50
8:  3     2 65.00 0.75
9:  3     3  7.80 0.58

这里的 order 表示 price 和 prob 值的序列号,否则它会被打乱。我想得到这个转变sparklyr

标签: rdplyrsparklyr

解决方案


您可以使用pivot_longer指定names_pattern.

tidyr::pivot_longer(a, cols = -id, 
                    names_to = c('.value', 'order'), 
                    names_pattern = '(.*?)(\\d+)')

# A tibble: 9 x 4
#     id order price  prob
#  <dbl> <chr> <dbl> <dbl>
#1     1 1      1.2  0.1  
#2     1 2      7.6  0.3  
#3     1 3      1.2  0.18 
#4     2 1      2.44 0.3  
#5     2 2      8    0.35 
#6     2 3      4.5  0.31 
#7     4 1      5.6  0.5  
#8     4 2     65    0.75 
#9     4 3      7.8  0.580

推荐阅读