根据给定值按 ID 更改数据集中的观察数

Changing number of observation in a dataset by IDs according to a given value

我在 R 中有这个数据集:

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

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

提前致谢

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

进行分组来创建 nb_long
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))

这是另一种选择。我们只是映射出从 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

我们可以尝试以下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