【问题标题】:R adding in a specified number of new rows conditionally based on other columnR根据其他列有条件地添加指定数量的新行
【发布时间】:2021-04-14 18:38:02
【问题描述】:

我有一个类似于以下的数据集,除了针对多个年龄组、时间段和状态的数千行:

state  time_period             gender   agegroup  cases
AL     1/1/2020-1/15/2020      F        10-19     2
AL     1/16/2020-1/30/2020     F        10-19     4
AL     1/31/2020-2/14/2020     F        10-19     5
AL     1/1/2020-1/15/2020      M        10-19     4
AL     1/16/2020-1/30/2020     M        10-19     17
AL     1/31/2020-2/14/2020     M        10-19     29
AK     1/1/2020-1/15/2020      M        20-29     50
AK     1/16/2020-1/30/2020     M        20-29     11
AK     1/31/2020-2/14/2020     M        20-29     29
AK     1/1/2020-1/15/2020      F        20-29     50
AK     1/16/2020-1/30/2020     F        20-29     11
AK     1/31/2020-2/14/2020     F        20-29     29

我想根据案例列中的数量有条件地添加新行,然后一起删除案例列。因此,如果案例列 == 2,那么我希望将状态、时间段、性别和年龄组重复两次。

所以以前三行为例,我希望新的数据框如下所示:

state  time_period             gender   agegroup 
AL     1/1/2020-1/15/2020      F        10-19     
AL     1/1/2020-1/15/2020      F        10-19     
AL     1/16/2020-1/30/2020     F        10-19     
AL     1/16/2020-1/30/2020     F        10-19     
AL     1/16/2020-1/30/2020     F        10-19     
AL     1/16/2020-1/30/2020     F        10-19     
AL     1/31/2020-2/14/2020     F        10-19     
AL     1/31/2020-2/14/2020     F        10-19     
AL     1/31/2020-2/14/2020     F        10-19     
AL     1/31/2020-2/14/2020     F        10-19     
AL     1/31/2020-2/14/2020     F        10-19  

我将如何实现这一目标?

【问题讨论】:

    标签: r dataframe data.table


    【解决方案1】:
    out <- dat[rep(seq_along(dat$cases), dat$cases),-5]
    head(out,20)
    #     state         time_period gender agegroup
    # 1      AL  1/1/2020-1/15/2020      F    10-19
    # 1.1    AL  1/1/2020-1/15/2020      F    10-19
    # 2      AL 1/16/2020-1/30/2020      F    10-19
    # 2.1    AL 1/16/2020-1/30/2020      F    10-19
    # 2.2    AL 1/16/2020-1/30/2020      F    10-19
    # 2.3    AL 1/16/2020-1/30/2020      F    10-19
    # 3      AL 1/31/2020-2/14/2020      F    10-19
    # 3.1    AL 1/31/2020-2/14/2020      F    10-19
    # 3.2    AL 1/31/2020-2/14/2020      F    10-19
    # 3.3    AL 1/31/2020-2/14/2020      F    10-19
    # 3.4    AL 1/31/2020-2/14/2020      F    10-19
    # 4      AL  1/1/2020-1/15/2020      M    10-19
    # 4.1    AL  1/1/2020-1/15/2020      M    10-19
    # 4.2    AL  1/1/2020-1/15/2020      M    10-19
    # 4.3    AL  1/1/2020-1/15/2020      M    10-19
    # 5      AL 1/16/2020-1/30/2020      M    10-19
    # 5.1    AL 1/16/2020-1/30/2020      M    10-19
    # 5.2    AL 1/16/2020-1/30/2020      M    10-19
    # 5.3    AL 1/16/2020-1/30/2020      M    10-19
    # 5.4    AL 1/16/2020-1/30/2020      M    10-19
    

    行名是无害的(并且可以重置为简单的数字),但它们确实表明(除了实际数据之外)前两行来自第 1 行,接下来的四行来自第 2 行,等等. (我不会依赖这个,我只是强调一个强化声明的人工制品。

    最终的行数符合预期:

    sum(dat$cases)
    # [1] 241
    nrow(out)
    # [1] 241
    

    【讨论】:

      猜你喜欢
      • 2023-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多