【问题标题】:Changing number of observation in a dataset by IDs according to a given value根据给定值通过 ID 更改数据集中的观察次数
【发布时间】:2021-09-22 21:41:31
【问题描述】:

我在 R 中有这个数据集:

我想根据nb变量改变数据,这意味着ID = 1将有5行,ID=2将有12行如下所示:

是否有任何 R 函数可以用来转换我的数据:)?

提前致谢

【问题讨论】:

    标签: r data-management


    【解决方案1】:

    我们需要tidyr中的uncount基于'nb'列进行扩展,默认情况下,它将列删除为.remove = TRUE,将其更改为FALSE,然后通过按组创建nb_long row_number()

    library(dplyr)
    library(tidyr)
    df1 %>%
       uncount(nb, .remove = FALSE) %>%
       group_by(ID) %>%
       mutate(nb_long = row_number()) %>%
       ungroup
    

    -输出

    # A tibble: 17 x 3
          ID    nb nb_long
       <int> <dbl>   <int>
     1     1     5       1
     2     1     5       2
     3     1     5       3
     4     1     5       4
     5     1     5       5
     6     2    12       1
     7     2    12       2
     8     2    12       3
     9     2    12       4
    10     2    12       5
    11     2    12       6
    12     2    12       7
    13     2    12       8
    14     2    12       9
    15     2    12      10
    16     2    12      11
    17     2    12      12
    

    数据

    df1 <- structure(list(ID = 1:2, nb = c(5, 12)), 
    class = "data.frame", row.names = c(NA, 
    -2L))
    

    【讨论】:

      【解决方案2】:

      这是另一种选择。我们只是将值从 1 映射到 nb,然后我们将向量的嵌套时间更长。

      #packages
      library(tidyverse)
      
      #data
      df1 <- structure(list(ID = 1:2, nb = c(5, 12)), 
      class = "data.frame", row.names = c(NA, 
      -2L))
      
      #solution
      df1 %>% 
        mutate(nums = map(nb, ~seq(1, .x, by = 1))) %>%
        unnest_longer(nums)
      #> # A tibble: 17 x 3
      #>       ID    nb  nums
      #>    <int> <dbl> <dbl>
      #>  1     1     5     1
      #>  2     1     5     2
      #>  3     1     5     3
      #>  4     1     5     4
      #>  5     1     5     5
      #>  6     2    12     1
      #>  7     2    12     2
      #>  8     2    12     3
      #>  9     2    12     4
      #> 10     2    12     5
      #> 11     2    12     6
      #> 12     2    12     7
      #> 13     2    12     8
      #> 14     2    12     9
      #> 15     2    12    10
      #> 16     2    12    11
      #> 17     2    12    12
      

      【讨论】:

        【解决方案3】:

        我们可以试试下面的data.table选项

        > setDT(df)[,.(nb_long = 1:nb),.(ID,nb)]
            ID nb nb_long
         1:  1  5       1
         2:  1  5       2
         3:  1  5       3
         4:  1  5       4
         5:  1  5       5
         6:  2 12       1
         7:  2 12       2
         8:  2 12       3
         9:  2 12       4
        10:  2 12       5
        11:  2 12       6
        12:  2 12       7
        13:  2 12       8
        14:  2 12       9
        15:  2 12      10
        16:  2 12      11
        17:  2 12      12
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-07
          • 1970-01-01
          • 1970-01-01
          • 2013-04-02
          • 1970-01-01
          • 1970-01-01
          • 2021-12-15
          • 1970-01-01
          相关资源
          最近更新 更多