【问题标题】:Extracting unequal number of rows by group in r在r中按组提取不相等的行数
【发布时间】:2020-02-20 18:22:58
【问题描述】:

我有一个按 Shape 分组的两个变量数据框,并希望为每个组提取前 n 行(分组变量的每个级别的 n 不同)。我尝试了一些 dplyr 和 data.table 函数,但它们似乎只适用于相同数量的行。

Data <- data.frame(Shape = c("R", "R", "R", "C", "C", "T", "T", "T", "T"), Area = c(35, 30, 25, 32, 28, 40, 35, 33, 31))

我想获得前 2 个 R,第一个 C 和前 3 个 T。预期结果:

Out <- data.frame(Shape = c("R", "R", "C", "T", "T", "T"), Area = c(35, 30, 32, 40, 35, 33))

【问题讨论】:

    标签: r dataframe row extract


    【解决方案1】:

    我们可以使用“Shape”列将group_split 转换为data.framelist,然后将map2 中的限制“n”传递给filter 相应的行数

    library(dplyr)
    library(purrr)
    Data %>% 
      group_split(Shape = factor(Shape, levels = unique(Shape))) %>% 
      map2_dfr(., c(2, 1, 3), ~ .x %>%
                                 filter(row_number() <= .y))
    # A tibble: 6 x 2
    #  Shape  Area
    #* <fct> <dbl>
    #1 R        35
    #2 R        30
    #3 C        32
    #4 T        40
    #5 T        35
    #6 T        33
    

    或者另一种选择是通过传递一个命名向量来获得一列“n”,然后按“形状”进行分组,执行filter

    Data %>%
        mutate(n = setNames(c(2, 1, 3), unique(Shape))[as.character(Shape)]) %>% 
        group_by(Shape) %>%
        filter(row_number() <= n[1]) %>%
        select(-n)
    

    【讨论】:

    • 非常感谢@akrun 的快速回复!这就是我想要的。
    • @akurn - 我想知道该方法是否适用于多个分组变量,而不仅仅是一个 - 比如说 3 个分组变量。谢谢。
    • 你只需要在 group by 中添加这些变量
    • @BMM 如果您有“n”个组,那么最好有一个 key/val 数据集,即keydat &lt;- crossing(Shape = unique(Data$Shape), grp1 = unique(Data$grp), grp2 = unique(Data$grp2)),然后为这些组合创建列“n”并进行连接就像在乔治的帖子中一样
    【解决方案2】:

    比 akrun 的版本稍微复杂一些,但可能更容易阅读:

    library(tidyverse)
    
    numberRows <- tibble(Shape = c("R", "C", "T")
            , firstRows = c(2,1,3))
    
    Data %>%
        left_join(numberRows, "Shape") %>%
        group_by(Shape) %>%
        slice(1:(mean(firstRows)))
    

    【讨论】:

    • 嗨@Georgery - 我尝试了你的方法,但由于某种原因,我没有得到问题的预期结果。我得到 2 Rs、2 Cs 和 2 Ts 而不是 2 Rs、1 C 和 3 T。我打算用你的方法解决一个更复杂的问题(多个分组变量)。感谢您的帮助!
    • 您有时间看我的问题吗?谢谢。
    • 如果我有多个分组变量并且多个组具有相同的 firstRows 值,我是否仍然按 firstRows 或分组变量对其进行分组并使用相同的方法。感谢您的帮助。
    • 是的。如果您有多个分组变量,则需要将它们包括在 1. 在 numberRows 数据帧中 2. 在 left_joinby = 参数中和 3. 在 group_by 中。
    猜你喜欢
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 2018-05-08
    相关资源
    最近更新 更多