以长格式过滤具有相同ID的对象

时间:2019-09-09 07:46:40

标签: r dplyr

我有一个数据集,其中包含成千上万个样本(行)和成千上万个对象(列),其中条目具有不同的属性,每个条目具有多个属性(我知道,不是很整洁)。 现在我不得不切换到长格式,只剩下四个列。在我可以轻松筛选出满足多个条件的样本之前。

在长格式中,如果我想过滤所有红色福特的对象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:由于我想在一个闪亮的应用程序中创建动态搜索,因此我不能简单地按样本分组并检查计数是否为两个。

1 个答案:

答案 0 :(得分:0)

似乎您不必区分颜色和汽车(假设您没有称为 Ford 的颜色或没有名为 red 的汽车)。当对象为value时,您可以选择redFordO1,即

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