根据R中每个id的最小和最大年龄增加多行

问题描述 投票:0回答:2

我有这个数据集:

现在我想添加行,其中包含每个id的最小值和最大值之间的所有年龄,如此数据集:

有人可以给我一些提示吗?提前致谢。

r reshape
2个回答
1
投票

这可以用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

0
投票

这是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 RMap

stack(setNames(do.call(Map, c(f = `:`, DF[-1])), DF$id))[2:1]

data

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
 ))
© www.soinside.com 2019 - 2024. All rights reserved.