【问题标题】:How to add rows based on group while iteravely adding one?如何在迭代添加一个时基于组添加行?
【发布时间】:2020-03-11 18:47:37
【问题描述】:

有没有人可以将行按组添加到一定长度而不必创建新的数据框?这是我当前的数据框,其中包含“组”和“金额”列

Group   Amount
 Dog      1
 Dog      2
 Dog      3
 Cat      3
 Cat      4
 Rat      7
 Rat      8
 Rat      9
 Rat      10

我正在尝试使它们的长度都相等,以便它们看起来如下所示:

Group   Amount
 Dog      1
 Dog      2
 Dog      3
 Dog      4
 Dog      5
 Dog      6
 Dog      7
 Cat      3
 Cat      4
 Cat      5
 Cat      6
 Cat      7
 Cat      8
 Cat      9
 Rat      7
 Rat      8
 Rat      9
 Rat      10
 Rat      11
 Rat      12
 Rat      13

我希望每个组的长度为 7,并且迭代地在组的尾部添加一个,直到它们达到所需的长度。

谢谢

【问题讨论】:

    标签: r dataframe group-by


    【解决方案1】:

    我们可以按'Group'分组,然后使用complete来展开行

    library(dplyr)
    library(tidyr)
    n <- 7
    df1 %>% 
         group_by(Group) %>%
         complete(Amount = min(Amount):(min(Amount) + (n -1))) %>%
         as.data.frame
    

    数据

    df1 <- structure(list(Group = c("Dog", "Dog", "Dog", "Cat", "Cat", "Rat", 
    "Rat", "Rat", "Rat"), Amount = c(1L, 2L, 3L, 3L, 4L, 7L, 8L, 
    9L, 10L)), class = "data.frame", row.names = c(NA, -9L))
    

    【讨论】:

    • 聪明,我一直在想一个不是expand.grid 和联接的解决方案。
    • 不错的一个。我很感激。
    • @GregorThomas 谢谢,对于边缘情况,我将其更改为 min
    • 感谢您的回答!那效果很好。非常感谢。
    【解决方案2】:

    data.table:

    library(data.table)
    
    setDT(df)[, .(Amount = seq(min(Amount), min(Amount) + 6)), by = Group]
    

    输出:

        Group Amount
     1:   Dog      1
     2:   Dog      2
     3:   Dog      3
     4:   Dog      4
     5:   Dog      5
     6:   Dog      6
     7:   Dog      7
     8:   Cat      3
     9:   Cat      4
    10:   Cat      5
    11:   Cat      6
    12:   Cat      7
    13:   Cat      8
    14:   Cat      9
    15:   Rat      7
    16:   Rat      8
    17:   Rat      9
    18:   Rat     10
    19:   Rat     11
    20:   Rat     12
    21:   Rat     13
    

    【讨论】:

    • 非常感谢!简单易懂
    猜你喜欢
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 2020-05-10
    • 2016-11-30
    • 1970-01-01
    相关资源
    最近更新 更多