问题描述
我有一个用户数据库,他们都需要一个特定的用户角色,在下面的示例中,对于他们所代表的每个公司,它是“用户角色 - 3”。
ex <- data.frame('Firm' = c("Firm 1","Firm 2","Firm 3","Firm 4","Firm 5"),'User' = c("Person 1","Person 2","Person 3","Person 4","Person 5","Person 5"),'Role' = c("User Role - 1","User Role - 1","User Role - 2","User Role - 3","User Role - 2"))
每个用户必须具有用户角色 - 分配给每个公司的 3 个角色。正如您在上表中所见,有些人在单个公司中担任多个角色,或者将个人分配到多个公司。我试图过滤掉所有拥有用户角色 - 3 的特定公司的用户,所以我留下了那些没有的用户。
如您所见,公司 2 /人员 2 已完全消失,因为他们被分配了多个角色给公司,其中之一是 3。虽然人员 5 具有用户角色 3,但它仅适用于两家公司之一所以他们仍然在他们没有的公司的名单上。
我什至不知道从哪里开始说实话。
ex %>% gather(Firm)
似乎给键值对带来了一些不适用于此处的东西。
ex %>% subset(Role != "User Role - 3")
没有考虑到公司 2 可以被完全删除。
我可以提取具有角色 ( ex %>% subset(Role == "User Role - 3")
) 的用户和公司列表,因此可以从原始列表中删除,这感觉像是开始的正确位置,但我不知道如何通过这个新信息过滤原始列表。当我尝试将子集应用于命令时,我收到一个错误。
toremove <- subset(ex$Role == "User Role - 3")
Error in subset.default(ex$Role == "User Role - 3") :
argument "subset" is missing,with no default
我确定这一定非常简单,也许是我想多了,现在只见树木不见森林。
任何帮助,甚至是正确前进步骤的线索,都将不胜感激。
解决方法
试试
ex %>%
group_by(Firm,User) %>%
filter(!("User Role - 3" %in% Role))
带有输出
> ex %>% group_by(Firm,User) %>% filter(!("User Role - 3" %in% Role))
# A tibble: 3 x 3
# Groups: Firm,User [3]
Firm User Role
<chr> <chr> <chr>
1 Firm 1 Person 1 User Role - 1
2 Firm 3 Person 3 User Role - 1
3 Firm 5 Person 5 User Role - 2