首页 > 解决方案 > 根据列中的值更长时间地透视数据集

问题描述

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

这是数据。我们有一个 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?)

标签: rpivottidyverse

解决方案


而不是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

推荐阅读