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应倒置。