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

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


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

最佳答案

使用data.tabletidyverse的一件好事是,您无需考虑所执行的操作是mutateexpand还是summarize。您可以将所需的内容放到jdf[i, j, k]部分中,无论要解析到多少行,这就是您得到的。

library(data.table)
setDT(general_tibble)

general_tibble[, .(n = seq(0, nrs))
               , by = names(general_tibble)]


#      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
#  ---
# 129:   male  18          17      65  47 43
# 130:   male  18          17      65  47 44
# 131:   male  18          17      65  47 45
# 132:   male  18          17      65  47 46
# 133:   male  18          17      65  47 47

关于r - 创建从0到表变量中的值的新列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56243500/

10-10 06:37