【发布时间】:2020-10-20 17:05:47
【问题描述】:
我正在寻找一种优雅的解决方案,用于根据条件组合、复制和改变行:
在我的示例中,我想组合 x = 1 和 x = 2,然后复制这些行。然后将每个子集变异回其原始分类。
数据
df <- tibble(x = c(1,1,1,2,2,2,3,4,5,6),
y = c(11,12,13,14,15,16,17,18,19,20),
z = c(21,22,23,24,25,26,27,28,29,30))
x y z
<dbl> <dbl> <dbl>
1 1 11 21
2 1 12 22
3 1 13 23
4 2 14 24
5 2 15 25
6 2 16 26
7 3 17 27
8 4 18 28
9 5 19 29
10 6 20 30
当前解决方案
当 x 在 1 或 2 时合并行并将它们存储为 1
df <- df %>%
mutate(x = ifelse(x %in% c(1,2), 1, x))
x 的过滤器为 1 并变异为 2。将其存储为子集
df_temp <- df %>%
filter(x == 1) %>%
mutate(x = 2)
将行绑定回来
df <- rbind(df,df_temp)
期望的输出
x y z
<dbl> <dbl> <dbl>
1 1 11 21
2 1 12 22
3 1 13 23
4 1 14 24
5 1 15 25
6 1 16 26
7 3 17 27
8 4 18 28
9 5 19 29
10 6 20 30
11 2 11 21
12 2 12 22
13 2 13 23
14 2 14 24
15 2 15 25
16 2 16 26
我认为第一步可以跳过。 separate_rows() 如果我将它们与分隔符结合起来,可能会在这里解决问题,但我想避免这种情况。
正在寻找 dplyr 解决方案。
编辑 2:
如果我们将上面的数据简化为:
df <- tibble(x = c(1,1,2,2,2,3,4,5,6),
y = c(11,12,14,15,16,17,18,19,20),
z = c(21,22,24,25,26,27,28,29,30))
其中 x = 1 和 x = 2 的行数不同。过滤和反转 y 和 z 不再给出正确的解决方案。
预期结果
x y z
<dbl> <dbl> <dbl>
1 1 11 21
2 1 12 22
3 1 14 24
4 1 15 25
5 1 16 26
6 2 14 24
7 2 15 25
8 2 16 26
9 2 11 21
10 2 12 22
11 3 17 27
12 4 18 28
13 5 19 29
14 6 20 30
【问题讨论】:
-
当
1:2范围内的行数超过 2 行时,您能否扩展您的示例和预期输出? -
@RonakShah 展开。