根据列中的值对数据集进行更长的透视

Pivot dataset longer based on value in a column

我想知道是否有任何 tidyverse 函数可以通过在一列中应用一个值来使数据集更长。如果我提供一个例子更容易解释。最终我想用它来将一个人级别的生存数据集转换为一个人的时期,但现在我只想知道这个简单的事情。

这是数据。我们有一个 id 变量 (id),一个时间不变的预测变量 (sex),以及一个告诉我们有多少个观察点被观察到的变量。

df <- data.frame(id = 1:3, 
                 sex = factor(c("m", "f", "f")),
                 years = c(4,5,3))
df

#   id sex years
# 1  1   m     4
# 2  2   f     5
# 3  3   f     3

现在我想扩大它,使每个参与者的行数对应于年份列中的数字,因此参与者 1 为 4,参与者 2 为 5,参与者 3 为 3。

所以我希望它看起来像这样

df2 <- data.frame(id = c(rep(1,4), rep(2,5), rep(3,3)),
                  rep = rep(c("m", "f", "f"),c(4,5,3)))

df2

#    id rep
# 1   1   m
# 2   1   m
# 3   1   m
# 4   1   m
# 5   2   f
# 6   2   f
# 7   2   f
# 8   2   f
# 9   2   f
# 10  3   f
# 11  3   f
# 12  3   f

是否有可以为我执行此操作的 tidyverse 函数?(也许 pivot_longer?)

而不是 pivot_longer,我们可以使用 uncount

轻松做到这一点
library(tidyr)
library(dplyr)
df %>% 
   uncount(years)

-输出

#    id sex
#1   1   m
#2   1   m
#3   1   m
#4   1   m
#5   2   f
#6   2   f
#7   2   f
#8   2   f
#9   2   f
#10  3   f
#11  3   f
#12  3   f

或使用 base R (R 4.1.0)

df$years |>
     {\(x) rep(seq_along(x), x)}() |> 
     {\(i) `[`(df, i, c('id', 'sex'))}() |>
     `row.names<-`(NULL)

-输出

#    id sex
#1   1   m
#2   1   m
#3   1   m
#4   1   m
#5   2   f
#6   2   f
#7   2   f
#8   2   f
#9   2   f
#10  3   f
#11  3   f
#12  3   f