r - 如何使用 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
解决方案
您可以使用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
推荐阅读
- mysql - 如何在 SQL 查询中按页面设置分页?
- android - 谷歌模型查看器没有对 Android 上的对象的反射
- docker - Docker:无法从主机中的浏览器访问容器
- batch-file - 从 cmd 行运行批处理文件
- php - 我们如何使用 CK.editor 将图形粘贴到 Php Text 区域?
- authentication - Google Cloud Storage:为每个对象授予用户/传递凭据
- java - 即使键和值不为空,Java hashmap 也会给出空值
- javascript - 等待来自 HttpClient 的响应 get - 同步调用
- bash - 遍历文件夹(名称中带有空格)并将文件名更改为文件夹名称
- javascript - 手动更新记录时未触发 Sequelize 挂钩