在 R 的数据框中过滤 "ONLY"

Filter "ONLY" in a dataframe in R

#虚拟 df

Store <- c("S1", "S2", "S2","S3")
Product <- c("Paper", "Pen", "Paper","Pen")

df <- data.frame(Store, Product)

在这个例子中,我想在过滤“Pen”时“只”提取“S3”存储。通过正常的过滤功能,它会带回 S2 和 S3。 想法是找回只卖笔不卖其他东西的商店。

df %>% filter(Product == "Pen")

这将返回 S2 和 S3

P.S:考虑到数据集要大很多,所以不能在Store列上放一个特定的过滤器。

提前致谢!

subset(df, Store == "S3" & Product == "Pen")

请注意,您可以使用 Sys.time 函数比较 subsetdplyr 的执行时间:

start <- Sys.time()
# execution code here
stop <- Sys.time()
duration <- stop - start

另请参阅 data.table 用于在 R 中管理大型数据集的包:

https://cran.r-project.org/web/packages/data.table/vignettes/datatable-intro.html

dplyr 包对这类操作非常有用。

filter()select() 函数是数据整理的主力军。

您可以使用多个条件作为 filter() 函数的参数。

library(dplyr)

df%>%filter(Store=='S3', Product=='Pen')

可能不是最漂亮的解决方案,但它应该有效:

df <- df[df$Product == "S3" & df$Store == "Pen", ]

您将想要获得“单一商品商店”列表 - 那些只销售单一商品的商店。

对于那些检查他们出售的(单个)物品是否等于“Pen”的人

library(dplyr)

Store <- c("S1", "S2", "S2","S3")
Product <- c("Paper", "Pen", "Paper","Pen")

df <- data.frame(Store, Product)

single_item_stores <- df %>% 
  group_by(Store) %>% 
  tally() %>% 
  filter(n == 1) %>% 
  pull(Store)

df %>% 
  filter(Store %in% single_item_stores & Product == "Pen")

也许你想要这个-

  • 第一个 expr inside [] selects 只有那些 select 只有一件商品的商店。
  • second expr select 商店至少销售 Pen
  • 因此将两者结合起来可能会得到您想要的结果
Store <- c("S1", "S2", "S2","S3")
Product <- c("Paper", "Pen", "Paper","Pen")

df <- data.frame(Store, Product)

df$Store[as.numeric(ave(df$Product, df$Store, FUN = function(x) length(x))) == 1 & df$Product == 'Pen']
#> [1] "S3"

reprex package (v2.0.0)

于 2021-05-13 创建

对于更复杂的情况,当您可能有重复的 hrows 时

Store <- c("S1", "S2", "S2","S3", "S3")
Product <- c("Paper", "Pen", "Paper","Pen", "Pen")

df <- data.frame(Store, Product)

unique(df$Store[as.numeric(ave(df$Product, df$Store, FUN = function(x) length(unique(x)))) == 1 & df$Product == 'Pen'])
#> [1] "S3"

reprex package (v2.0.0)

于 2021-05-13 创建

我认为最好的解决方案是在 filter() 之前使用 group_by()。这将允许您检查给定商店的所有产品是否为“Pen”,如下所示:

df %>%
  group_by(Store) %>%
  filter(all(Product == "Pen")) %>%
  ungroup()
#> # A tibble: 1 x 2
#>   Store Product
#>   <chr> <chr>  
#> 1 S3    Pen