【发布时间】:2021-08-10 10:54:26
【问题描述】:
我目前有一张桌子,里面有数量。
| ID | Code | Quantity |
|---|---|---|
| 1 | A | 1 |
| 2 | B | 3 |
| 3 | C | 2 |
| 4 | D | 1 |
有没有办法弄到这张表?
| ID | Code | Quantity |
|---|---|---|
| 1 | A | 1 |
| 2 | B | 1 |
| 2 | B | 1 |
| 2 | B | 1 |
| 3 | C | 1 |
| 3 | C | 1 |
| 4 | D | 1 |
我需要分解数量并拥有那么多行。
谢谢!!!!
【问题讨论】:
标签: r
我目前有一张桌子,里面有数量。
| ID | Code | Quantity |
|---|---|---|
| 1 | A | 1 |
| 2 | B | 3 |
| 3 | C | 2 |
| 4 | D | 1 |
有没有办法弄到这张表?
| ID | Code | Quantity |
|---|---|---|
| 1 | A | 1 |
| 2 | B | 1 |
| 2 | B | 1 |
| 2 | B | 1 |
| 3 | C | 1 |
| 3 | C | 1 |
| 4 | D | 1 |
我需要分解数量并拥有那么多行。
谢谢!!!!
【问题讨论】:
标签: r
更新 现在我们将分离的、折叠的值存储到一个新列中:
library(dplyr)
library(tidyr)
df %>%
group_by(ID) %>%
uncount(Quantity, .remove = FALSE) %>%
mutate(NewQ = 1)
# A tibble: 7 x 4
# Groups: ID [4]
ID Code Quantity NewQ
<int> <chr> <int> <dbl>
1 1 A 1 1
2 2 B 3 1
3 2 B 3 1
4 2 B 3 1
5 3 C 2 1
6 3 C 2 1
7 4 D 1 1
更新
如果我们选择不使用折叠的值替换现有的 Quantity 列。
df %>%
group_by(ID) %>%
mutate(NewQ = ifelse(Quantity != 1, paste(rep(1, Quantity), collapse = ", "),
as.character(Quantity))) %>%
separate_rows(NewQ) %>%
mutate(NewQ = as.numeric(NewQ))
# A tibble: 7 x 4
# Groups: ID [4]
ID Code Quantity NewQ
<int> <chr> <int> <dbl>
1 1 A 1 1
2 2 B 3 1
3 2 B 3 1
4 2 B 3 1
5 3 C 2 1
6 3 C 2 1
7 4 D 1 1
【讨论】:
使用rep 的基本 R 选项
transform(
`row.names<-`(df[rep(1:nrow(df), df$Quantity), ], NULL),
Quantity = 1
)
给予
ID Code Quantity
1 1 A 1
2 2 B 1
3 2 B 1
4 2 B 1
5 3 C 1
6 3 C 1
7 4 D 1
【讨论】:
我们可以使用slice
library(dplyr)
df %>%
group_by(ID) %>%
slice(rep(1:n(), each = Quantity)) %>%
mutate(Quantity= rep(1))
输出:
ID Code Quantity
<dbl> <chr> <dbl>
1 1 A 1
2 2 B 1
3 2 B 1
4 2 B 1
5 3 C 1
6 3 C 1
7 4 D 1
【讨论】: