创建从0到表变量中的值的新列

Den*_*lar 2 r dplyr tidyverse tibble

可重制的小标题:我有一个类似于以下所示的数据库。所不同的是,我正在使用的数据库更大。

general_tibble <- tibble(gender = c("female", "female", "male"),
                             age = c(18, 19,18),
                             age_partner = c(22,20,17),
                             max_age = c(60, 60, 65), 
                             nrs =c(42,41,47))
Run Code Online (Sandbox Code Playgroud)

general_tibble 结果是 :

  gender age age_partner max_age nrs
1 female  18          22      60  42
2 female  19          20      60  41
3   male  18          17      65  47
Run Code Online (Sandbox Code Playgroud)

问题: 如何从上一个表中创建一个新表,该表采用的值nrs,并创建一个名为的列变量n,该变量 从0到in的值nrs

为了进一步说明,在第1行general_tibble的列nrs是等于42,从而柱会去从0到42,在第2行nrs是等于41,从而柱会去从0到41,与同为第3行。

我目前正在使用下面的代码。它可以工作,但是当general_tibble太大时,代码的执行速度会非常慢。

general_list <- list()

for(i in 1:NROW(general_tibble)){
  general_list[[i]] <- data.frame(general_tibble[i, ], 
                             n = 0:general_tibble[[i, "nrs"]])
} 
Run Code Online (Sandbox Code Playgroud)

然后我bind_rows() general_list获得 general_binded

general_binded <- bind_rows(general_list)
Run Code Online (Sandbox Code Playgroud)

general_binded[c(1:5, 38:42),] 结果是 :

   gender age age_partner max_age nrs  n
1  female  18          22      60  42  0
2  female  18          22      60  42  1
3  female  18          22      60  42  2
4  female  18          22      60  42  3
5  female  18          22      60  42  4
38 female  18          22      60  42 37
39 female  18          22      60  42 38
40 female  18          22      60  42 39
41 female  18          22      60  42 40
42 female  18          22      60  42 41
Run Code Online (Sandbox Code Playgroud)

PS:在for循环中,我使用data.frame()而不是tibble()因为我想回收行。如果您有涉及微动或数据帧的建议,请不要接受。

M--*_*M-- 5

最简单的方法是使用函数扩展general_tibbleon nrstidyr::expand()

library(tidyverse)

general_tibble %>% 
        group_by_all()%>% 
        expand(n = 0:nrs)

#> # A tibble: 133 x 6
#> # Groups:   gender, age, age_partner, max_age, nrs [3]
#>    gender   age age_partner max_age   nrs     n
#>    <chr>  <dbl>       <dbl>   <dbl> <dbl> <int>
#>  1 female    18          22      60    42     0
#>  2 female    18          22      60    42     1
#>  3 female    18          22      60    42     2
#>  4 female    18          22      60    42     3
#>  5 female    18          22      60    42     4
#>  6 female    18          22      60    42     5
#>  7 female    18          22      60    42     6
#>  8 female    18          22      60    42     7
#>  9 female    18          22      60    42     8
#> 10 female    18          22      60    42     9
#> # ... with 123 more rows
Run Code Online (Sandbox Code Playgroud)

reprex软件包(v0.2.1)创建于2019-05-21


另一个仅使用base R函数的想法:

expanded_vars <- do.call(rbind,lapply(general_tibble$nrs, 
                                              function(x) expand.grid(x, 0:x)))
names(expanded_vars) <- c("nrs", "n")

merge(y = expanded_vars, x = general_tibble, by = "nrs", all = TRUE)
Run Code Online (Sandbox Code Playgroud)