嗨,假设我有以下数据框
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/