**可复制的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))
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
**问题:**如何从上一个表创建一个新表,该表接受nrs
的值,并创建一个名为n
的列变量,该变量从0到nrs
中的值?
为了进一步说明,在general_tibble
的第1行中,列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"]])
}
则我bind_rows()
general_list
得到general_binded
general_binded <- bind_rows(general_list)
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
**附言:**在for循环中,我使用data.frame()
而不是tibble()
,因为我想循环使用行。如果你有一些关于tibble或dataframe的建议,我很乐意接受。
5条答案
按热度按时间hlswsv351#
最简单的方法是使用
tidyr::expand()
函数在nrs
列上扩展general_tibble
:创建于2019-05-21由reprex package(v0.2.1)
只使用 *
base R
* 函数的另一个想法:h22fl7wq2#
使用
data.table
和tidyverse
的一个好处是,你不需要考虑你所做的操作是mutate
、expand
还是summarize
,你只需要把你想要的放在df[i, j, k]
的j
部分,不管解析成多少行,你都得到了。deikduxw3#
我们可以使用
uncount
另一个选项是
unnest
bvuwiixz4#
使用
dplyr
和tidyr
,您还可以:8yparm6h5#
一种方法与基地R(减去
tibble
包)。首先,按
nrs
组拆分。其次,按nrs
值扩展每个 Dataframe 的行。第三,创建一个表示0的id
列:无论行数是多少。第四,将其恢复为tibble
: