r语言 - dplyr过滤器(多个条件)功能缺少数据



我正在尝试使用多个条件(完全匹配+部分匹配(过滤我的数据集。但是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"))

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

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

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

==仅适用于长度为 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

最新更新