r - 加宽数据框并插入缺失的列
问题描述
编辑:更多数据添加了dput()
格式。
我有以下产品数据框,column
具有模式promo、marca、descripción、cantidad、precio。有时促销会丢失。
我需要更广泛形式的数据框(例如 with pivot_wider
),但是在找不到列的地方插入一个NA
值。
# A tibble: 18 x 2
text column
<chr> <chr>
1 2 X$39.990Ahorro:$14.990 promo
2 Pampers marca
3 Pañales Desechables Premium Care XXG 112 Unidades descripción
4 112 Un cantidad
5 $27.490 precio
6 2 X$39.990Ahorro:$14.990 promo
7 Pampers marca
8 Pañales Desechables Premium Care XG 112 Unidades descripción
9 112 Un cantidad
10 $27.490 precio
11 Babysec marca
12 Toalla Húmeda Premium X 140/6 descripción
13 1 Un cantidad
14 $2.590 precio
15 Emuwipes marca
16 Toallitas Húmedas Premium 85 Un c/u Bolsa descripción
17 2 Un cantidad
18 $2.650 precio
这是 的输出df %>% mutate(id = row_number()) %>% pivot_wider(...)
。有没有办法缩小这个输出?
# A tibble: 18 x 6
id promo marca descripción cantidad precio
<int> <chr> <chr> <chr> <chr> <chr>
1 1 2 X$39.990Ahorro:$~ NA NA NA NA
2 2 NA Pampers NA NA NA
3 3 NA NA Pañales Desechables Premium Care XXG ~ NA NA
4 4 NA NA NA 112 Un NA
5 5 NA NA NA NA $27.4~
6 6 2 X$39.990Ahorro:$~ NA NA NA NA
7 7 NA Pampers NA NA NA
8 8 NA NA Pañales Desechables Premium Care XG 1~ NA NA
9 9 NA NA NA 112 Un NA
10 10 NA NA NA NA $27.4~
11 11 NA Babysec NA NA NA
12 12 NA NA Toalla Húmeda Premium X 140/6 NA NA
13 13 NA NA NA 1 Un NA
14 14 NA NA NA NA $2.590
15 15 NA Emuwipes NA NA NA
16 16 NA NA Toallitas Húmedas Premium 85 Un c/u B~ NA NA
17 17 NA NA NA 2 Un NA
18 18 NA NA NA NA $2.650
数据:
text = c("2 X$39.990Ahorro:$14.990", "Pampers",
"Pañales Desechables Premium Care XXG 112 Unidades", "112 Un",
"$27.490", "2 X$39.990Ahorro:$14.990", "Pampers", "Pañales Desechables Premium Care XG 112 Unidades",
"112 Un", "$27.490", "Babysec", "Toalla Húmeda Premium X 140/6",
"1 Un", "$2.590", "Emuwipes", "Toallitas Húmedas Premium 85 Un c/u Bolsa",
"2 Un", "$2.650", "Parent's Choice", "Toallitas Húmedas Ultra Soft con Aceite de Emu 160 Un",
"160 Un", "$2.550", "Emuwipes", "Toallitas Húmedas sin Alcohol (2 Bolsas de 80 Un c/u) Bolsa 2 Un",
"$1.990", "3 X$45.990Ahorro:$13.980", "Babysec", "Pañal Super Premium XXG68",
"1 Un", "$19.990", "Parent's Choice", "Toallitas Húmedas Ultra Soft con Aceite de Emu y sin Aroma (2 Un de 80 Un c/u)",
"160 Un", "$2.550", "2 X$39.990Ahorro:$14.990", "Pampers", "Pañales Desechables Premium Care G 124 Unidades",
"124 Un", "$27.490", "Huggies")
column = c("promo", "marca",
"descripción", "cantidad", "precio", "promo", "marca", "descripción",
"cantidad", "precio", "marca", "descripción", "cantidad", "precio",
"marca", "descripción", "cantidad", "precio", "marca", "descripción",
"cantidad", "precio", "marca", "descripción", "precio", "promo",
"marca", "descripción", "cantidad", "precio", "marca", "descripción",
"cantidad", "precio", "promo", "marca", "descripción", "cantidad",
"precio", "marca")
解决方案
使用dcast
从data.table
. 将 'data.frame' 转换为 'data.table' ( setDT
),创建一个具有累积和的公式(基于取lag
'column' ( shift
),检查值是否等于 'precio',得到累积和 ( cumsum
)) 使用“列”,并指定value.var
为“文本”dcast
以从“长”格式重塑为“宽”格式
library(data.table)
dcast(setDT(df), cumsum(shift(column, fill = "") == "precio" )~ column, value.var = 'text')
推荐阅读
- python - 通常无法在 Pycharm 上安装 pygame 和软件包
- tensorflow - FCN中Conv2DTranspose层的问题
- quicksort - APL中快速排序的解释
- r - 官员 r 包用于创建具有并排内容的幻灯片 - 内容仅出现在一个部分中
- android - 使用 android EncryptedSharedPreference 的最低 API 级别?
- uikit - 使自定义 SwiftUI 视图适应内置修饰符
- java - 密码和用户名存储在 Apache Ignite 中的什么位置?
- c# - HTMLAgilityPack InnerHTML,解析错误错误
- flutter - 如何解决 OS 错误:Permission denied, errno = 13 in flutter
- java - 在同一个项目中跨多个模块重用测试类