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()因为我想回收行。如果您有涉及微动或数据帧的建议,请不要接受。
最简单的方法是使用函数扩展general_tibbleon nrs列tidyr::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)