R 按组保留行,直到列中第一次出现值为止。不允许没有值的组

R 按组保留行,直到列中第一次出现值为止。不允许没有值的组,r,dplyr,R,Dplyr,我有一个这样的数据框: > df id type 1 1 a 2 1 a 3 1 b 4 1 a 5 1 b 6 2 a 7 2 a 8 2 b 9 3 a 10 3 a 我希望将每个组(id)的所有行保持在类型列中第一次出现值“b”之前。对于没有类型“b”的组,我希望保留其所有行 生成的数据帧应如下所示: > dfnew id type 1 1 a 2 1 a 3 1 b

我有一个这样的数据框:

> df
  id type
1  1    a
2  1    a
3  1    b
4  1    a
5  1    b
6  2    a
7  2    a
8  2    b
9  3    a
10 3    a
我希望将每个组(id)的所有行保持在类型列中第一次出现值“b”之前。对于没有类型“b”的组,我希望保留其所有行

生成的数据帧应如下所示:

> dfnew
  id type
1  1    a
2  1    a
3  1    b
4  2    a
5  2    a
6  2    b
7  3    a
8  3    a
我尝试了下面的代码,但它保留了超出第一次出现的“b”之外的值为“a”的其他行,并且只排除了其他出现的“b”,这不是我想要的。请看下面的第4行。我想摆脱它

> df %>% group_by(id) %>% filter(cumsum(type == 'b') <= 1)
Source: local data frame [7 x 2]
Groups: id

  id type
1  1    a
2  1    a
3  1    b
4  1    a
5  2    a
6  2    a
7  2    b
8  3    a
9  3    a

>df%>%groupby(id)%>%filter(cumsum(type='b')您可以将
匹配
哪个
切片
或(如@Richard所述)
哪个.max

library(dplyr)
df %>% 
  group_by(id) %>% 
  slice(if(any(type == "b")) 1:which.max(type == "b") else row_number())    
# Source: local data table [8 x 2]
# Groups: id
# 
#   id type
# 1  1    a
# 2  1    a
# 3  1    b
# 4  2    a
# 5  2    a
# 6  2    b
# 7  3    a
# 8  3    a

或者您可以使用
数据表来尝试

library(data.table)
setDT(df)[, if(any(type == "b")) .SD[1:which.max(type == "b")] else .SD, by = id]
#    id type
# 1:  1    a
# 2:  1    a
# 3:  1    b
# 4:  2    a
# 5:  2    a
# 6:  2    b
# 7:  3    a
# 8:  3    a

或者只是
which.max()
我在我的数据帧上得到这个错误:error:NA/NaN参数。我认为原因是不是所有的“组”都有类型=='b'。使用
slice(1:which.max(类型='b')不会得到这个错误
,但在这种情况下,您需要的输出是什么?我根据这个用例和需要的输出修改了我的问题。我使用的命令正确地处理了这种情况,但没有排除在遇到类型“b”后出现的行。我将尝试哪个.max()。好的,请参阅我的编辑和使用
数据的另一个解决方案。表