【问题标题】:Create new rows based on numbers in a column [duplicate]根据列中的数字创建新行[重复]
【发布时间】:2021-08-10 10:54:26
【问题描述】:

我目前有一张桌子,里面有数量。

ID Code Quantity
1 A 1
2 B 3
3 C 2
4 D 1

有没有办法弄到这张表?

ID Code Quantity
1 A 1
2 B 1
2 B 1
2 B 1
3 C 1
3 C 1
4 D 1

我需要分解数量并拥有那么多行。

谢谢!!!!

【问题讨论】:

    标签: r


    【解决方案1】:

    更新 现在我们将分离的、折叠的值存储到一个新列中:

    library(dplyr)
    library(tidyr)
    
    df %>%
      group_by(ID) %>%
      uncount(Quantity, .remove = FALSE) %>%
      mutate(NewQ = 1)
    
    # A tibble: 7 x 4
    # Groups:   ID [4]
         ID Code  Quantity  NewQ
      <int> <chr>    <int> <dbl>
    1     1 A            1     1
    2     2 B            3     1
    3     2 B            3     1
    4     2 B            3     1
    5     3 C            2     1
    6     3 C            2     1
    7     4 D            1     1
    

    更新 如果我们选择不使用折叠的值替换现有的 Quantity 列。

    df %>%
      group_by(ID) %>%
      mutate(NewQ = ifelse(Quantity != 1, paste(rep(1, Quantity), collapse = ", "),
                               as.character(Quantity))) %>%
      separate_rows(NewQ) %>%
      mutate(NewQ = as.numeric(NewQ))
    
    
    # A tibble: 7 x 4
    # Groups:   ID [4]
         ID Code  Quantity  NewQ
      <int> <chr>    <int> <dbl>
    1     1 A            1     1
    2     2 B            3     1
    3     2 B            3     1
    4     2 B            3     1
    5     3 C            2     1
    6     3 C            2     1
    7     4 D            1     1
    

    【讨论】:

    • 谢谢!!!它完美地工作。除了替换原始的 Quantity 变量,您知道如何添加一个带有突破的新变量吗?我正在尝试保留原始版本以进行可视化...
    • @LauraCuesta 很高兴。是的,当然,我刚刚修改了这两种解决方案,以便我们有一个用于分隔折叠值的新列。
    【解决方案2】:

    使用rep 的基本 R 选项

    transform(
      `row.names<-`(df[rep(1:nrow(df), df$Quantity), ], NULL),
      Quantity = 1
    )
    

    给予

      ID Code Quantity
    1  1    A        1
    2  2    B        1
    3  2    B        1
    4  2    B        1
    5  3    C        1
    6  3    C        1
    7  4    D        1
    

    【讨论】:

      【解决方案3】:

      我们可以使用slice

      library(dplyr)
      df %>% 
        group_by(ID) %>% 
        slice(rep(1:n(), each = Quantity)) %>% 
        mutate(Quantity= rep(1))
      

      输出:

           ID Code  Quantity
        <dbl> <chr>    <dbl>
      1     1 A            1
      2     2 B            1
      3     2 B            1
      4     2 B            1
      5     3 C            1
      6     3 C            1
      7     4 D            1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-19
        • 1970-01-01
        • 1970-01-01
        • 2019-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多