R:如何按条件插入行?

R:如何按条件插入行?,r,dplyr,tidyr,R,Dplyr,Tidyr,假设我们有一个如下所示的数据帧: A B C D XX WW 0 0 XX WW 0 1 WW XX 0 1 XX WW 1 1 XX WW 1 0 YY ZZ 0

假设我们有一个如下所示的数据帧:

A         B          C           D
XX        WW         0           0
XX        WW         0           1
WW        XX         0           1
XX        WW         1           1
XX        WW         1           0
YY        ZZ         0           1
YY        ZZ         0           1
ZZ        YY         1           0
YY        ZZ         1           1
我想在每一行中添加一个新行,其中D等于1,a和B保持不变。整个表应该遵循的规则是,每当D等于1时,A和B应该将其值反转为下一个值,假设C和D在这些新引入的行中等于0。在本例中,我所需的输出应如下所示:

A         B          C           D
XX        WW         0           0
XX        WW         0           1
WW        XX         0           1
XX        WW         1           1
WW        XX         0           0
XX        WW         1           0
YY        ZZ         0           1
ZZ        YY         0           0
YY        ZZ         0           1
ZZ        YY         1           0
YY        ZZ         1           1

我尝试使用dplyr和tidyr都没有成功,任何帮助都将不胜感激。

我不完全确定这是否符合您的逻辑,但可能很接近

第一个
mutate
是存储
A
列以交换
A
B

groupby
将创建组,然后插入带有
rbind
的新行<代码>A和
B
将被交换,而
C
D
将被设置为零

library(tidyverse)

df %>%
  mutate(tmp = A) %>%
  group_by(
    grp = cumsum(A == lag(A, default = "") & B == lag(B, default = "") & lag(D) == 1)
  ) %>%
  do(
    rbind(
      mutate(
        head(., 1), A = B, B = tmp, C = 0, D = 0
      ), .
    )
  ) %>%
  ungroup %>%
  slice(-1) %>%
  select(-grp, -tmp)
输出

   A     B         C     D
   <chr> <chr> <dbl> <dbl>
 1 XX    WW        0     0
 2 XX    WW        0     1
 3 WW    XX        0     1
 4 XX    WW        1     1
 5 WW    XX        0     0
 6 XX    WW        1     0
 7 YY    ZZ        0     1
 8 ZZ    YY        0     0
 9 YY    ZZ        0     1
10 ZZ    YY        1     0
11 YY    ZZ        1     1
A B C D
1 XX WW 0 0
2 XX WW 0 1
3 WW XX 0 1
4 XX WW 1
5 WW XX 0 0
6 XX WW 1 0
7 YY ZZ 0 1
8zzyy0
9 YY ZZ 0 1
10 ZZ YY 10
11 YY ZZ 1 1

如果相同的“A”、“B”值仅为一行,而D为1,则在该事件中,没有可添加的行。当D为1时,下一行中的A和B应倒置。