在 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
函数比较 subset
与 dplyr
的执行时间:
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
#虚拟 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
函数比较 subset
与 dplyr
的执行时间:
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