我有一个大型数据集,我想在其中使用dplyr进行过滤并选择数据以创建12个单独的数据帧。
基本上,我只使用来自较大数据集的两列数据。第一列是“图”,在这里我按“图”号和另一个第三列中的另一条件(“ pos_ID”)进行过滤。我想创建一个按图号(我尝试过plot==[i]
)和第3个条件进行过滤的循环,然后创建一个新的数据框。该循环将重复12次(因为绘图范围为1-12)。
这是我不带循环使用的代码(基于示例数据)
p1_Germ <- data %>% #p1 stands for plot 1
filter(plot==1, pos_ID<21) %>%
select(germ_bin)
这是我尝试合并循环的代码(基于示例数据)
for(i in seq_along(plot)) {
data %>%
group_by(plot[[i]], pos_ID<21) %>%
select(germ_bin)
}
以下是一些示例数据
plot <- c(1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12)
germ_bin <- c(0,0,1,0,1,0,0,1,1,0,1,1,0,1,0,1,0,1,1,0,1,0,1,0)
pos_ID <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24)
dataset <- data.frame(plot, germ_bin, pos_ID)
dataset
我的猜测是使用列表,但我对循环和列表不熟悉,无法在线找到解决方案。我需要创建12个数据框,因为我试图将它们分别转换为另一个函数的矩阵。任何帮助将不胜感激!
答案 0 :(得分:1)
我们可以根据标准使用group_split
和map
至filter
来获取数据帧列表。
library(dplyr)
library(purrr)
dataset %>%
group_split(plot) %>%
map(. %>% filter(pos_ID < 21) %>% select(germ_bin))
#[[1]]
# A tibble: 2 x 1
# germ_bin
# <dbl>
#1 0
#2 0
#[[2]]
# A tibble: 2 x 1
# germ_bin
# <dbl>
#1 1
#2 0
#[[3]]
# A tibble: 2 x 1
# germ_bin
# <dbl>
#1 1
#2 0
#....
对于共享示例,如果要删除空组,可以先filter
dataset %>%
filter(pos_ID < 21) %>%
group_split(plot) %>%
map(. %>% select(germ_bin))
就您对for
循环的尝试而言,您可以通过这样做来纠正
unique_plot <- unique(dataset$plot)
plot_list <- list(length = length(unique_plot))
for(i in seq_along(unique_plot)) {
plot_list[[i]] <- dataset %>%
filter(plot == unique_plot[i], pos_ID<21) %>%
select(germ_bin)
}
或将其完全保留在基数R中
lapply(split(dataset, dataset$plot), function(x)
subset(x, pos_ID < 21, select = germ_bin, drop = FALSE))