r - 使用 dplyr 在组之间插入虚拟多 X 行?
问题描述
嗨,假设我有以下数据框
df <- data.frame(group = rep(c("group_1","group_2","group_3", "group_4", "group_5", "group_6"), each=3),
X = paste(letters[1:18]),
Y = c(1:18))
df
group X Y
1 group_1 a 1
2 group_1 b 2
3 group_1 c 3
4 group_2 d 4
5 group_2 e 5
6 group_2 f 6
7 group_3 g 7
8 group_3 h 8
9 group_3 i 9
10 group_4 j 10
11 group_4 k 11
12 group_4 l 12
13 group_5 m 13
14 group_5 n 14
15 group_5 o 15
16 group_6 p 16
17 group_6 q 17
18 group_6 r 18
我想要的是在 Y 列中插入 5 行值为 -10 但保留组 ID
我尝试根据类似的交叉帖子执行此操作,但似乎无法保留组 ID,这似乎只能插入 1 行。
> df %>%
+ group_split(group) %>%
+ map_dfr(~ .x %>%
+ add_row(Y = -10, .after = 0))
# A tibble: 24 x 3
group X Y
<chr> <chr> <dbl>
1 NA NA -10
2 group_1 a 1
3 group_1 b 2
4 group_1 c 3
5 NA NA -10
6 group_2 d 4
7 group_2 e 5
8 group_2 f 6
9 NA NA -10
上面的例子失败了,因为它只插入了 1 行,而且组 id 丢失了,例如,理想情况下,应该有 5 行插入 group_1,Y 值为 -10。
这可能吗?提前致谢!
解决方案
我们可以在uncount
之后添加add_row
以复制第一行 5 次
library(dplyr)
library(tidyr)
library(purrr)
library(tibble)
df %>%
group_split(group) %>%
map_dfr(~ .x %>%
add_row(group = first(.x$group), Y = -10, .after = 0) %>%
uncount(rep(c(5, 1), c(1, n()-1))))
-输出
# A tibble: 48 x 3
# group X Y
# <chr> <chr> <dbl>
# 1 group_1 <NA> -10
# 2 group_1 <NA> -10
# 3 group_1 <NA> -10
# 4 group_1 <NA> -10
# 5 group_1 <NA> -10
# 6 group_1 a 1
# 7 group_1 b 2
# 8 group_1 c 3
# 9 group_2 <NA> -10
#10 group_2 <NA> -10
# … with 38 more rows
或者由于列数只有 3,我们也可以在按“组”分组后dplyr
单独执行此操作。summarise
在 的较新版本中dplyr
,summarise
没有每组返回单行的约束
df %>%
group_by(group) %>%
summarise(X = c(rep(NA_character_, 5), X),
Y = c(rep(-10, 5), Y), .groups = 'drop')
# A tibble: 48 x 3
# group X Y
# <chr> <chr> <dbl>
# 1 group_1 <NA> -10
# 2 group_1 <NA> -10
# 3 group_1 <NA> -10
# 4 group_1 <NA> -10
# 5 group_1 <NA> -10
# 6 group_1 a 1
# 7 group_1 b 2
# 8 group_1 c 3
# 9 group_2 <NA> -10
#10 group_2 <NA> -10
# … with 38 more rows
推荐阅读
- javascript - 如何在 AJAX 查询结果出现之前暂停 HTML 和 JavaScript 文档加载?
- asp.net-mvc - 如何调用位于“Views/Home/Login/Login.cshtml”上的视图?
- python - Pandas 对聚合 min 和 max 的分组速度极慢
- postgresql - 将 PostgreSQL 数据目录更改为 PostgresSQL 在另一台机器上创建的目录
- python - geopy 不会为加拿大邮政编码返回正确的坐标
- excel - 有没有办法在用户窗体上嵌套相关的组合框?
- c - 在 Netfilter 中分配更多有效负载空间的正确方法?
- c# - 在 .ics 文件的 DateTime 对象中指定时区 - 时间相差一个小时(C#,Sitecore 9)
- typescript - 是否有禁止前缀类型断言语法的 TSLint 规则?
- filemaker - FileMaker 错误:无法在此磁盘上创建 PDF