【问题标题】:Filtering rows between zero values and save as new dataframes or datatables in R过滤零值之间的行并在 R 中另存为新的数据框或数据表
【发布时间】:2020-10-08 10:57:17
【问题描述】:

我有一个包含超过 45k 行和 19 个不同变量的大型 csv 数据集。我想通过特定变量(V4)对其进行过滤,以便每个过滤组以 0 开头,然后下一个 0 将标记新组/数据框/数据表的开始,同时将所有其他变量保留在这个新表中好。我需要这些单独的组来进一步分析每个数据案例。 我试过了:

filtered_data <- my_data %>%       
group_by("V4") %>%       
filter("V4" == 0 & "V4" !=0)      
View(filtered_data)    

第一个“V4”== 0 似乎有效,但我正在努力如何定义每个过滤数据帧的结尾,例如如何过滤从 0 到 3,然后从 0 到 5 等。 如何确定每个案例的长度?是否有逻辑运算符在 V4 再次变为 0 之前保存每个组?还是创建一个循环会更好?

my_data 示例:

        V1    V2    V3    V4    .    .    .    V19 
    1                     0
    2                     1
    3                     2
    4        `            3
    5                     0
    6                     1
    7                     2
    8                     3
    9                     4
    10                    5
    11                    0
   ...
   45k   

【问题讨论】:

    标签: r dataframe filter group-by datatables


    【解决方案1】:

    这是一种使用基本算术对行进行分组的方法。 我使用指标变量的累积总和(V4 是否为 0)创建组,并使用 group_split 将 data.frame 拆分为单个数据帧。

    # example data 12000 rows in total, 4000 groups of 3 rows
    df <- data.frame(V1 = 1:12000, 
                     V2 = sample(LETTERS, 12000, replace = T), 
                     V4 = rep(0:2, 4000))
    
    df <- df %>%
      mutate(Groups = ifelse(V4 == 0, 1, 0),
             Groups = cumsum(Groups)) %>%
      group_split(Groups)
    

    所以第一个组/数据框是

    > df[[1]]
    # A tibble: 3 x 4
         V1 V2       V4 Groups
      <int> <chr> <int>  <dbl>
    1     1 L         0      1
    2     2 L         1      1
    3     3 Y         2      1
    

    第二个

    > df[[2]]
    # A tibble: 3 x 4
         V1 V2       V4 Groups
      <int> <chr> <int>  <dbl>
    1     4 Z         0      2
    2     5 N         1      2
    3     6 Y         2      2
    

    等等。

    如果您想单独保存每个 data.frame,您可以使用以下内容:

    # new environment that holds all data.frames
    dfEnv <- new.env()
    
    df %>%
      mutate(Groups = ifelse(V4 == 0, 1, 0),
             Groups = cumsum(Groups)) %>%
      group_by(Groups) %>%
      do({
        # save every group inside the new environment as a single data.frame
        dfEnv[[paste0("Group_", unique(.$Groups))]] <- .
      })
    

    现在你有dfEnv$Group_1dfEnv$Group_2,...等等。 在do() 内部,您还可以使用saveRDSwrite.csv 将数据保存到磁盘。

    【讨论】:

    • 谢谢!我注意到这需要很长时间来计算,例如超过 1600 组,因为每组都打印在屏幕上,而不是单独存储。有什么方法可以加快这个过程?
    • 只保存列表,然后什么都不会打印。我编辑我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2021-08-25
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多