我有一个长格式的大型数据集(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
}
}
}
这是一种使用rlang
和purrr
parse_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
,让你的函数绘制你想要的任何内容。