r - 根据列中的值更长时间地透视数据集
问题描述
我想知道是否有任何 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?)
解决方案
而不是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
推荐阅读
- c# - 即使使用值实体框架,实体属性也为空
- flask - 使用 SQLAlchemy 提交表单会抛出“列表”对象没有属性
- sharepoint - 为什么我无法在 Sharepoint 2013 中激活此特定功能?
- logstash - 收到与您配置的字符编码不同的事件
- go - 向函数添加可变参数会破坏现有代码吗?
- session - 将语言会话 ID 从一个域保留到下一个域
- python - 如何在 openRefine 中获取以结尾的字符串
- node.js - 如何将 req 参数绑定或传递给 Passport.js JWT 策略?
- sql-server - SQL 查询,其中 WHERE 子句对来自另一个表中的列的所有数据使用 LIKE
- python - 确定变量是否是任何类的实例