r - 扩大数据框并插入缺失的列

标签 r dplyr tidyverse tidyr data-manipulation

编辑:更多数据以 dput() 格式添加。

我有以下产品数据框, 的模式为promo, marca, descripción, cantidad, precio。有时促销会丢失。

我需要更宽形式的数据框(如使用 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")

最佳答案

使用 data.table 中的 dcast。将 'data.frame' 转换为 'data.table' (setDT),创建一个具有累加和的公式(基于取 'column' 的 lag(shift),检查值是否等于'precio',获取累加和(cumsum))与'column',并指定value.var 作为 dcast 中的“文本”以从“长”格式 reshape 为“宽”格式

library(data.table)
 dcast(setDT(df), cumsum(shift(column, fill = "") == "precio" )~ column, value.var = 'text')

关于r - 扩大数据框并插入缺失的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68883838/

相关文章:

R 将数据框中的字符串更改为数字

html - 更改 R Shiny 文本输入指令的字体系列/大小/样式

r - geom_mosaic : X axis tick labels not showing?

使用 dplyr 根据另一个向量替换 NA 每列

regex - 使用 dplyr 在选定的列上添加具有行均值的列

对 sf 对象的行操作

r - ggplot sec_axis 我可以使用向量作为反式公式吗?

r - 从每个案例的创建时间开始计算未结案例的更有效方法

r - 用 R 中的最后一个或下一个非 NA 值填充 NA

r - tidyverse/stringr 如何查找和替换完全匹配的内容