R 根据列出的列的唯一组合动态筛选数据帧中的行



我有一个长格式的大型数据集(49 列,16000 行(。 最终,我需要按用户定义的特定列的唯一组合过滤数据集,以便绘制其他动态选择的列。 绘图将使用 ggplots2 和分面(x,y,facet_column、facet_row、colorbin(完成。

我没有展示我的大数据集,而是使用"mtcars"数据集将一个小得多的示例放在一起来说明我的问题。我有正确的列输出,但没有一系列 for 循环,我无法弄清楚如何更改子集。

设置数据:

#Load needed libraries
library("dplyr", "tidyr", "ggplot2")
#Convert row.names into a column that can be called
data <- tibble::rownames_to_column(mtcars, "Names")
#Declare groups:
#group_rows are the columns that I need to filter my data based on the unique combinations
#  Ultimately, I want to create a new plot of group_cols based on these rows
group_rows <- list(list('cyl', 'gear'), list('vs', 'carb'))
#group_cols are the columns I want included in the plot
group_cols <- list(list('Names', 'mpg','cyl', 'gear'), list('Names', 'wt','vs', 'carb'))

这可以工作并产生我需要的输出,但超级不方便

由于我没有动态过滤"group_rows"变量,因此我必须对group_rows中的每个列表变体重复循环。在我的示例中,我的group_rows的每个列表中只有两个变量,但在我的实际数据集中,我可以拥有更多变量。

# Do group_rows 1
for (c in group_cols){
for (var_cyl in unique(data$cyl)){
for (var_gear in unique(data$gear)){
df <- data %>%
filter(cyl==var_cyl &gear==var_gear) %>%
select_(.dots = c)
# enter my plotting function
}
}
}
# Do group_rows 2
for (c in group_cols){
for (var_vs in unique(data$vs)){
for (var_carb in unique(data$carb)){
df <- data %>%
filter(vs==var_vs &carb==var_carb) %>%
select_(.dots = c)
# enter my plotting function
}
}
}

这是一种使用rlangpurrrparse_expr的方法

我对您的group_rows进行了轻微修改,以包含一些过滤:

group_rows <- list(list("cyl==4", "&", "gear==4"), list("vs==1", "&", "carb==4"))
library(dplyr)
library(purrr)
library(rlang)
map2(group_cols,group_rows,
~ data %>%
dplyr::select(unlist(.x)) %>%
dplyr::filter(!!parse_expr(paste(.y,collapse = "")))
)
[[1]]
Names  mpg cyl gear
1     Datsun 710 22.8   4    4
2      Merc 240D 24.4   4    4
3       Merc 230 22.8   4    4
4       Fiat 128 32.4   4    4
5    Honda Civic 30.4   4    4
6 Toyota Corolla 33.9   4    4
7      Fiat X1-9 27.3   4    4
8     Volvo 142E 21.4   4    4
[[2]]
Names   wt vs carb
1  Merc 280 3.44  1    4
2 Merc 280C 3.44  1    4

我不清楚你打算如何绘制 4 列。但是你可以用walk2代替map2,让你的函数绘制你想要的任何内容。

最新更新