R中数据帧的条件子集

R中数据帧的条件子集,r,dataframe,R,Dataframe,我在R中有一个数据帧,如下所示: Id group category number 001 1 A 0.10 001 1 B 0.15 002 2 A 0.55 003 3 A 0.75 003 3 B 0.45 现在,我希望每个Id只有一行。对于组1和2中的Id,应主要使用类别为B的行。如果组1或2中没有类别为B的行,则应使用类别A。对于组为3的

我在R中有一个数据帧,如下所示:

Id   group   category number
001  1       A        0.10
001  1       B        0.15
002  2       A        0.55
003  3       A        0.75
003  3       B        0.45
现在,我希望每个
Id
只有一行。对于
1和2中的Id,应主要使用
类别
为B的行。如果
1或2中没有
类别
为B的行,则应使用
类别
A。对于
为3的
Id
,应始终使用
类别
为A的行

输出应该如下所示

Id   group   category number
001  1       B        0.15
002  2       A        0.55
003  3       A        0.75

在R中如何做到这一点?

由于
B
A
之后,我们将按类别降序排序,每组保留一行,根据您的建议过滤掉第3组/A类行

library(dplyr) 
your_data %>%
  filter(!(group == 3 & category == "A")) %>%
  group_by(Id, group) %>%
  arrange(desc(category)) %>%
  slice(1)

我们可以使用
slice

library(dplyr)
df1 %>% 
   group_by(Id) %>%
   slice(max(match('B', category, nomatch = 0), 1))
数据
df1抱歉-没有仔细阅读,错过了不同组的不同规则。编辑了我的答案,现在应该可以使用了。@Falc我认为您的描述或预期的输出不正确。对于“Id”3,类别为“A”、“B”,根据说明,应使用类别为“B”的行。你能帮我吗clarify@GregorThomas,谢谢你的回答。由于某种原因,不幸的是,这没有起作用。但是,如果我先删除组为3,类别为B的所有行,我想你的第一个答案可能会有效。你能再写一次建议吗,因为我没有时间尝试吗?@akrun对于Id 3,应该始终使用类别为A的行,如最后一句所述。当然,我将恢复对答案的编辑并添加该过滤器。
df1 <- structure(list(Id = c("001", "001", "002", "003", "003"), group = c(1L, 
1L, 2L, 3L, 3L), category = c("A", "B", "A", "A", "B"), number = c(0.1, 
0.15, 0.55, 0.75, 0.45)), row.names = c(NA, -5L), class = "data.frame")