在dplyr链中删​​除具有序列的行组

时间:2015-08-11 00:42:28

标签: r dataframe dplyr window-functions

我正在尝试从data.frame中删除一些行。这些唯一行位于我的data.frame的每个第3组中。 这是示例df

set.seed(1)

AC <- rep(rep(c(78,110),each=1),times=18)
state <- rep(rep(c("Group 1","Group 2"),3),each=12)
V <- rep(seq(100,400,100),times=9)
R = sort(replicate(9, sample(5000:6000,4)))
df <- data.frame(AC,V,R,state)
  

头(DF)

   AC   V    R   state
1  78 100 5001 Group 1
2 110 200 5054 Group 1
3  78 300 5064 Group 1
4 110 400 5069 Group 1
5  78 100 5117 Group 1
6 110 200 5123 Group 1

通过V列中的更改对它们进行排序。每100:400序列中V列发生更改。因此,每3行中的state个组都会发生变化。 我想删除每个组中的3rd组 我认为添加No列以删除此3rd列可能也很有用。我在这里提供的示例已经group_by,所以我只需要添加新的No列并删除data.frame组的第3,第6,第9 ......。

我希望在dplyr链中进行此过程。因为我在dplyr链中处理我的真实数据。但我欢迎任何其他功能来做到这一点。

我寻找的输出

   No  AC   V    R   state
    1  78 100 5001 Group 1
    1 110 200 5008 Group 1
    1  78 300 5022 Group 1
    1 110 400 5055 Group 1
    2  78 100 5133 Group 1
    2 110 200 5163 Group 1
    2  78 300 5187 Group 1
    2 110 400 5189 Group 1
    4  78 100 5459 Group 2
    4 110 200 5467 Group 2
    4  78 300 5471 Group 2
    4 110 400 5501 Group 2
    5  78 100 5515 Group 2
    5 110 200 5531 Group 2
    5  78 300 5540 Group 2
    5 110 400 5553 Group 2
    7  78 100 5686 Group 1
    7 110 200 5717 Group 1
    7  78 300 5726 Group 1
    7 110 400 5755 Group 1
   ***********************

1 个答案:

答案 0 :(得分:2)

有点难以理解你的问题,因为当我复制你可重复的例子时,我的数据帧不等于你的。但据我了解,你只想对每组4行进行编号(根据V)并删除每三行。

在这种情况下,请尝试:

df %>% 
  mutate(No = cumsum(df$V == 100)) %>%
  subset(No %% 3 != 0)

第二行使用df$V == 100表示“开始新的Vs块”以分配号码。

在回复你对Q的评论时,我没有在这里使用state列(如在可重现的示例中,每个(州,V)都有 9 行而不是 3 如问题中所述...)

请注意,这假设df已按上述问题排序(Vs为(100,200,300,400)重复顺序,且状态每12行交替一次)