【问题标题】:Missing data from dplyr filter (multiple conditions) functiondplyr 过滤器(多个条件)函数中缺少数据
【发布时间】:2020-06-29 21:19:03
【问题描述】:

我正在尝试使用多个条件(完全匹配 + 部分匹配)过滤我的数据集。但是dplyr 中的filter 函数只返回符合条件的部分结果。这是一个例子:

df1 <- structure(list(Date = c("6/24/2020", "6/24/2020", "6/24/2020", "6/24/2020", "6/25/2020", "6/25/2020"), 
                      Market = c("A", "A", "A", "B", "B", "B"), Salesman = c("MF", "RP", "FR", "FR", "MF", "MF"), 
                      Product = c("* Apple", "Apple", "* Banana", "* Orange", "* Apple", "* Banana"), Quantity = c(20L, 15L, 20L, 20L, 10L, 15L), 
                      Price = c(1L,1L, 2L, 3L, 1L, 1L), Cost = c(0.5, 0.5, 0.5, 0.5, 0.6, 0.6)), 
                 class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6"))

以下代码应该返回行13,但它只返回第一行:

library(tidyr)
df1 %>%
  filter(Salesman == c("MF","FR"),
         Market == "A",
         grepl("* ",Product))

似乎是grepl("* ",Product) 引起了问题,但我需要它返回包含* Product

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    == 仅适用于长度为 1 的向量。如果超过此长度,它将回收并导致意外输出。在这里,对于第一种情况,我们需要 %in%,而在 grepl 中,* 是一个元字符(零个或多个)。转义 (\\*) 或将其放在方括号中 ([*]) 或使用 fixed = TRUE 进行逐字评估。 fixed = TRUE 可能更快,所以我们在这里使用它

    library(dplyr)
    df1 %>% 
         filter(Salesman %in% c("MF", "FR"),
                Market == "A",  
                grepl("*", Product, fixed = TRUE))
    #   Date Market Salesman  Product Quantity Price Cost
    #1 6/24/2020      A       MF  * Apple       20     1  0.5
    #3 6/24/2020      A       FR * Banana       20     2  0.5
    

    如果应该从字符串的开头(^)提取*,那么我们可以转义它*

    df1 %>% 
         filter(Salesman %in% c("MF", "FR"),
                Market == "A",  
                grepl("^\\*", Product))
    #       Date Market Salesman  Product Quantity Price Cost
    #1 6/24/2020      A       MF  * Apple       20     1  0.5
    #3 6/24/2020      A       FR * Banana       20     2  0.5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-06
      • 2022-11-18
      • 2021-03-22
      • 2018-04-13
      • 2020-04-17
      • 2018-07-10
      • 1970-01-01
      • 2020-07-06
      相关资源
      最近更新 更多