如何取消堆叠 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))
我在一长列中有一个嵌套数据。数据表示各个商店的不同库存商品。每个商品都有编号、商品、有效期、制造商、数量、单价、折扣和总价 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))