如何取消堆叠 r 中行数不均匀的长列并命名列

how to unstack a long column with uneven number of rows in r and name the columns

我在一长列中有一个嵌套数据。数据表示各个商店的不同库存商品。每个商品都有编号、商品、有效期、制造商、数量、单价、折扣和总价 6 个值。这些物品按数字 1、2、3 列出,然后从新商店 1、2 开始,然后是下一个 1、2、3 等。我的目标是在一行中收集一个商店的所有物品,只要有是 1 开始新行


1
ABC RH --
Pack
Mar 2022
ABC D --
280
.20 
[=10=] 
$ 1 456.0
2
ABC RH --
Pack
Mar 2022
ABC D --
280
.20 
[=10=] 
$ 1 456.0
1
BCD
Amp
Apr 2024
XYZ
280
.00 
[=10=] 
$ 2 555.0
2
BCD RH --
Amp
Mar 2024
ABC D --
280
.20 
[=10=] 
$ 1 456.0
3
BCD RH --
Pack
Mar 2022
ABC D --
280
.20 
[=10=] 
$ 1 456.0
1
1. HJK
Pack
Mar 2023
D --
80
[=10=].20 
[=10=] 
$ 3 456.0
2
2. BCD
Pack
Mar 2022
ABC D --
280
.20 
[=10=] 
$ 1 456.0
3
BCD RH --
Pack
Mar 2022
ABC D --
280
.20 
[=10=] 
$ 1 456.0
4
BCD RH --
Pack
Mar 2022
ABC D --
280
.20 
[=10=] 
$ 1 456.0
5
BCD RH --
Pack
Mar 2022
ABC D --
280
.20 
[=10=] 
$ 1 456.0
6
BCD RH --
Pack
Mar 2022
ABC D --
280
.20 
[=10=] 
$ 1 456.0

这是我试图将其显示为

 |No |Item  | Size |Exp     |Manuf |Qty  |Unit |Dis |Total    |No| Item|
 |1  |ABC RH| Pack |Mar 2022| ABC D| 280 |.20|[=11=]  |$ 1 456.0|2 | ABC |
 |1  |BCD RH| Amp  |Apr 2024| XYZ  | 280 |.00|[=11=]  |$ 2 555.0|2 | BCD |
 |1  |1. HJK| Pack |Mar 2023| D -- | 80  |[=11=].20|[=11=]  |$ 3 456.0|2.| BCD |

感谢您的帮助

你可以试试 tidyverse

library(tidyverse)
as.data.frame(df) %>% 
  mutate(V2 = cumsum(df == "1")) %>% 
  group_by(V2) %>%
  mutate(V4 = 1:n()) %>% 
  pivot_wider(names_from = V4, values_from = df, names_prefix = "Item") %>% 
  ungroup() %>% 
  select(-V2)
  # A tibble: 3 x 9
  Item1 Item2 Item3 Item4 Item5 Item6 Item7 Item8 Item9
  <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 1     A     B     C     2     A     B     NA    NA   
2 1     A     B     C     D     NA    NA    NA    NA   
3 1     A     2     A     B     C     3     A     B   

使用 base R 的可能解决方案:

df=c('1','A','B','C','2','A','B','C','1','A','B','C','1','A','B','C','2','A','B','C','3','A','B','C')
df <- data.frame(V=df)

idx <- which(df$V == 1)
n <- length(idx)

leng <- idx[-1]-idx[-n]
leng <- c(leng,length(df$V)-idx[n]+1)

l <- split(df$V, rep(1:n, leng))
l <- lapply(l, `length<-`, max(lengths(l)))

as.data.frame(do.call(rbind,l))