我有一个数据集,其中包含成千上万个样本(行)和成千上万个对象(列),其中条目具有不同的属性,每个条目具有多个属性(我知道,不是很整洁)。 现在我不得不切换到长格式,只剩下四个列。在我可以轻松筛选出满足多个条件的样本之前。
在长格式中,如果我想过滤所有红色福特的对象O1,则存在问题。在宽格式中,我可以简单地添加一个AND条件,但是长期以来,我必须对Car和Color使用OR条件,但是随后我将获得仅满足一个条件的样本。
df <- data.frame(
sample = c("A", "A", "A", "B", "B", "C", "C"),
object = c("O1", "O1", "O2", "O1", "O2", "O1", "O1"),
property = c("Color", "Car", "Weather", "Car", "Animal", "Color", "Car"),
value = c("red", "Ford", "Rain", "Ford", "Dog", "red", "Volkswagen")
)
df %>% dplyr::filter((object == "O1" & property == "Color" & value == "red") |
object == "O1" & property == "Car" & value == "Ford")
现在,我还将获得红色为红色的示例,但该车不是For车,反之亦然。
有没有一种方法可以不连接两个过滤表?
PS:由于我想在一个闪亮的应用程序中创建动态搜索,因此我不能简单地按样本分组并检查计数是否为两个。
答案 0 :(得分:0)
似乎您不必区分颜色和汽车(假设您没有称为 Ford 的颜色或没有名为 red 的汽车)。当对象为value
时,您可以选择red
为Ford
或O1
,即
df %>%
filter(value %in% c('red', 'Ford') & object == 'O1')
# sample object property value
#1 A O1 Color red
#2 A O1 Car Ford
#3 B O1 Car Ford
#4 C O1 Color red
我可能会想得太多,但这是根据您的要求的解决方案,它不使用2作为长度。
df %>%
group_by(sample) %>%
mutate(new = toString(value)) %>%
filter(grepl('\\bred, Ford\\b', new) & object == 'O1') %>%
ungroup() %>%
select(-new)
给出,
# A tibble: 2 x 4 sample object property value <chr> <chr> <chr> <chr> 1 A O1 Color red 2 A O1 Car Ford