【问题标题】:Creating multiple dataframes from one based on every row above a certain value根据高于某个值的每一行从一个数据帧创建多个数据帧
【发布时间】:2019-07-29 16:27:40
【问题描述】:

我目前有一个 Excel 表格,它是我公司使用的一类电子表格的一般格式。这些行不是固定的,但它们通常看起来像这样

ID  work_order  Item                            value
1               hero                            9399393
2               zero                            393030
3               hereto                          3322
4               Subsidy Transfer 2018 Medium    9292
5   203         akron                           17272
6   002         saffron                         2345
7   004         Percentage Dispersed            2222
8   005         hi                              105
9   203         bye                             202
10  202         END          
11    
12 UNFORMATTED DATA

所以我想把它分成三个不同的数据框。 1. 以“Subsidy Transfer”开头的call_type之前和包括在内的每一行 2.“补贴转移”后的每一行以及“分散百分比”前后的所有内容 3.“Percentage Dispersed”之后和“END”之前的每一行

所以我的代码肯定会找到我正在寻找的行...

df[grep("Subsidy Transfer", df$Item), ]

但我不确定如何为三个组复制此操作以获取三个对象,同时还保留变量名称。从本质上讲,这三个场景之上和之下的所有内容都是有意义的。

最后,我希望看到三个不同的数据框供我使用上述规范进行操作。

【问题讨论】:

    标签: r grepl


    【解决方案1】:

    您只需要 Item 列进行分组,所以我简化了您的数据框。

    library(dplyr)
    library(tidyr)
    workflow <- data.frame(
        Item = c("a","c","d","Subsidy Transfer 2018 Medium ","a","g","f","d","Percentage Dispersed  ","e","END")
    )
    
    > workflow
                                Item
    1                              a
    2                              c
    3                              d
    4  Subsidy Transfer 2018 Medium 
    5                              a
    6                              g
    7                              f
    8                              d
    9         Percentage Dispersed  
    10                             e
    11                           END
    
    

    回答你的问题

    您需要标记关键行(例如使用标签 1、2、3)并使用tidyr::fill() 用关键行的标签填充缺失值。

    result <- workflow %>%
        mutate(group = case_when(
            grepl("^Subsidy Transfer",Item) ~ 1L,
            grepl("^Percentage Dispersed",Item) ~ 2L,
            grepl("^END",Item) ~ 3L
        )) %>%
        fill(group,.direction = "up") %>%
        group_by(group)
    
    result_list <- group_split(result)
    
    > result_list
    [[1]]
    # A tibble: 4 x 2
      Item                            group
      <fct>                           <int>
    1 a                                   1
    2 c                                   1
    3 d                                   1
    4 "Subsidy Transfer 2018 Medium "     1
    
    [[2]]
    # A tibble: 5 x 2
      Item                     group
      <fct>                    <int>
    1 a                            2
    2 g                            2
    3 f                            2
    4 d                            2
    5 "Percentage Dispersed  "     2
    
    [[3]]
    # A tibble: 2 x 2
      Item  group
      <fct> <int>
    1 e         3
    2 END       3
    

    【讨论】:

    • 你从哪里得到的“填充”功能?
    • tidyr::fill() 来自 tidyr 包。刚刚修改了我的答案以包括我使用的包。
    • 嗯,它可以工作,只是它不包括各自组中的“补贴转移”、“分散百分比”或“结束”行
    • 修改后的解决方案,使其位于不同的组中。
    • 我的意思是“END”行不是读为 3,也不是读为 2,等等。相反,它们开始在新事物处重新编号
    【解决方案2】:

    使用stringr 包,因为grep 系列函数未矢量化。

    df$split <- cumsum(stringr::str_detect(df$call_type, "Subsidy Transfer|Percentage|END")) # Identify cutoff rows
    df$split <- df$split - stringr::str_detect(df$call_type, "Subsidy Transfer|Percentage|END") # Make cutoff rows belong to the preceding group
    
    split(df, df$split) # split by these groups
    

    【讨论】:

      【解决方案3】:

      这个呢?:

      您可以创建一个空列表来保存分割后的 3 个数据框:

      df_split<-list()
      
      df_split<-list(df[1:which(df$Item=="Subsidy Transfer 2018 Medium"),], 
                     df[(1+which(df$Item=="Subsidy Transfer 2018 Medium")):which(df$Item=="Percentage Dispersed"),],
                     df[which(df$Item=="Percentage Dispersed") +1:length(df),])
      

      【讨论】:

        猜你喜欢
        • 2022-08-12
        • 1970-01-01
        • 1970-01-01
        • 2020-09-18
        • 2022-08-06
        • 2019-12-22
        • 1970-01-01
        • 1970-01-01
        • 2022-01-24
        相关资源
        最近更新 更多