我有这个数据集:
现在我想添加行,其中包含每个id的最小值和最大值之间的所有年龄,如此数据集:
有人可以给我一些提示吗?提前致谢。
这可以用data.table
完成
DF <- data.frame(id = 1:5,
min_age = c(60, 55, 72, 67, 58),
max_age = c(65, 57, 72, 69, 61))
library(data.table)
setDT(DF)[, .(age = seq(min_age, max_age)), by = id]
# id age
# 1: 1 60
# 2: 1 61
# 3: 1 62
# 4: 1 63
# 5: 1 64
# 6: 1 65
# 7: 2 55
# 8: 2 56
# 9: 2 57
#10: 3 72
#11: 4 67
#12: 4 68
#13: 4 69
#14: 5 58
#15: 5 59
#16: 5 60
#17: 5 61
这是tidyverse
的一个选项。我们在map2
中使用transmute
获得'min_age','max_age'的序列,然后在unnest
列中获得list
以获得预期输出
library(tidyverse)
DF %>%
transmute(id = id, age = map2(min_age, max_age, `:`)) %>%
unnest
# id age
#1 1 60
#2 1 61
#3 1 62
#4 1 63
#5 1 64
#6 1 65
#7 2 55
#8 2 56
#9 2 57
#10 3 72
#11 4 67
#12 4 68
#13 4 69
#14 5 58
#15 5 59
#16 5 60
#17 5 61
或者使用base R
和Map
stack(setNames(do.call(Map, c(f = `:`, DF[-1])), DF$id))[2:1]
DF <- structure(list(id = 1:5, min_age = c(60, 55, 72, 67, 58), max_age = c(65,
57, 72, 69, 61)), class = "data.frame", row.names = c(NA, -5L
))