根据列中的值对数据集进行更长的透视
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
我想知道是否有任何 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