在R中,我希望在每个b
之后的前两个c
和a
之后删除任何实例(请注意编号)。
我得到了以下内容:
1 a
2 b
3 c
4 a
5 b
6 c
7 a
8 b
9 c
10 b
11 c
12 a
13 b
14 c
15 c
我希望将其缩减为:
1 a
2 b
3 c
4 a
5 b
6 c
7 a
8 b
9 c
12 a
13 b
14 c
如果可能的话,我试图在dplyr
管道内执行此操作。
有什么想法吗?
答案 0 :(得分:3)
这个怎么样?
d <- data.frame(lets = c("a", "b", "c", "a", "b", "c", "a", "b", "c", "b", "c", "a", "b", "c", "c"))
d %>%
mutate(lag1 = lag(lets),
lag2 = lag(lag1)) %>%
filter(is.na(lag2) |
!(lets == lag1 | lets == lag2 | lag1 == lag2)) %>%
select(lets)
lets
1 a
2 b
3 c
4 a
5 b
6 c
7 a
8 b
9 c
10 a
11 b
12 c
答案 1 :(得分:2)
一种可能的解决方案:
df = read.table(text="1 a
2 b
3 c
4 a
5 b
6 c
7 a
8 b
9 c
10 b
11 c
12 a
13 b
14 c
15 c",header=F)
library(dplyr)
df %>% mutate(x=cumsum(V2=='a')) %>%
group_by(x) %>%
filter(!duplicated(V2)) %>%
ungroup() %>%
select(-x)
输出:
# A tibble: 12 x 2
V1 V2
<int> <fctr>
1 1 a
2 2 b
3 3 c
4 4 a
5 5 b
6 6 c
7 7 a
8 8 b
9 9 c
10 12 a
11 13 b
12 14 c
请注意,每次遇到a
后,都会删除所有重复的元素。如果您只想删除重复的b
和c
,请考虑:filter(!(duplicated(V2) & (V2=='b' | V2=='c')))