gpt4 book ai didi

r - 根据条件组合和复制行

转载 作者:行者123 更新时间:2023-12-04 02:34:10 25 4
gpt4 key购买 nike

我正在寻找一种基于条件合并、复制和改变行的优雅解决方案:

在我的示例中,我想合并 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)

将行绑定(bind)回去

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

最佳答案

你可以试试

df %>% 
full_join(filter(df, x %in% 1:2) %>% complete(x, y))
# A tibble: 5 x 2
x y
<dbl> <dbl>
1 1 6
2 2 7
3 3 8
4 1 7
5 2 6

当包含 z 列时,必须像 yz 这样的嵌套列完成

df %>% 
full_join(filter(df, x %in% 1:2) %>%
complete(x, nesting(y, z))) %>%
arrange(x)
# A tibble: 16 x 3
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 2 14 24
8 2 15 25
9 2 16 26
10 2 11 21
11 2 12 22
12 2 13 23
13 3 17 27
14 4 18 28
15 5 19 29
16 6 20 30

关于r - 根据条件组合和复制行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62656694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com