r - 使用 dplyr 在组之间插入虚拟多个 X 行?

标签 r dplyr

嗨,假设我有以下数据框

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 列中插入值为 -10 的 5 行,但保留组 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 行而且 group id 丢失了,理想情况下,应该有 5 行 group_1 插入 Y 值为 -10。

这可能吗?提前致谢!

最佳答案

我们可以在 add_row 之后添加 uncount 来复制第一行 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

关于r - 使用 dplyr 在组之间插入虚拟多个 X 行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66925583/

相关文章:

r - 如何在R中生成带有累积频率和相对频率的频率表

r - grepl 查找允许的任何字符串

使用并行包删除僵尸进程

r - 有条件地复制数据框中的行

hadoop - 在 Sparklyr 中创建新的 Spark 表或数据框的最有效方法是什么?

r - 用于工具包文档的 docker : `docker export` not including all layers?

'[<-.data.frame' 中的 R 错误...替换有 # 项,需要 #

r - dplyr 按字符串总结

r - 是否有任何明确保证 dplyr 操作保留行顺序?

r - 使用 dplyr 转置时间序列(有滞后的变异)