循环dplyr并创建多个数据框

时间:2019-05-29 02:06:08

标签: r loops dplyr

我有一个大型数据集,我想在其中使用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个数据框,因为我试图将它们分别转换为另一个函数的矩阵。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

我们可以根据标准使用group_splitmapfilter来获取数据帧列表。

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))