【问题标题】:Looping dplyr and creating multiple dataframe循环 dplyr 并创建多个数据框
【发布时间】:2019-10-14 13:40:29
【问题描述】:

我有一个大型数据集,我想在其中使用 dplyr 并过滤并选择数据以创建 12 个单独的数据框。

基本上,我只使用来自较大数据集的两列数据。第一列是“绘图”,我在其中按“绘图”编号和另一个第三列(“pos_ID”)中的另一个条件进行过滤。我想创建一个按图号(我试过plot==[i])和第三个条件过滤的循环,然后创建一个新的数据框。循环将重复 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 个数据帧,因为我试图在另一个函数之后将它们分别转换为一个矩阵。任何有帮助的将不胜感激!

【问题讨论】:

    标签: r loops dplyr


    【解决方案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))
    

    【讨论】:

    • 嗨!谢谢您的答复。我尝试了每种方法,前两种方法都有效。我很好奇为什么for 循环在每个列表中只保留两个观察结果......第二个后续问题:如何访问列表中的每个数据框(换句话说,我想应用矩阵函数到 12 个新数据帧中的每一个)
    • @Cam.S 我认为是因为在filter 之后每个子集中只剩下 2 个项目?此外,要访问单个列表,您可以将前两个选项的输出分配给变量,例如 plot_list,然后使用 plot_list[[1]]plot_list[[2]] 访问它们。
    • 太棒了。如何将所有结果转换为不同的数据框?比如ds_1、ds_2、ds_3?
    • @Luis 命名列表输出。如果将输出保存在名为plot_list 的变量中,则可以先使用names(plot_list) &lt;- paste0('ds_', seq_along(plot_list)),然后使用list2env(plot_list, .GlobalEnv)
    猜你喜欢
    • 2015-08-18
    • 2020-05-24
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    相关资源
    最近更新 更多