使用 reshape2 熔化两组列从宽到长
Melting two sets of columns from wide- to long-form using reshape2
我正在尝试使用 reshape2::melt
向长格式数据帧添加时变预测变量,但我想知道是否有更快的方法。
这里是宽表的玩具数据。在不同的 visits/time 点采取了三种结果变量测量(session1、session2 和 session3)。这三次访问之间的持续时间对于每个参与者都是不同的,最终我想将这些差异纳入模型中。
id <- 1:10
group <- rep(c("A", "B"), times = 5)
session1 <- rnorm(10, 5, 1)
session2 <- rnorm(10, 3, 1)
session3 <- rnorm(10, 7, 2)
time1 <- rep(0, 10)
time2 <- rnorm(10, 24, 0.5)
time3 <- rnorm(10, 48, 0.5)
df <- data.frame(id, group, session1, session2, session3, time1, time2, time3)
现在我想转换成长格式数据框。我使用 reshape2::melt
。我可以像这样围绕分数创建它:
library(reshape2)
dfLong <- melt(df, measure.vars = c("session1", "session2", "session3"), var = "session", value.name = "score")
或者我可以围绕时间值创建它。
dfLong2 <- melt(df, measure.vars = c("time1", "time2", "time3"), var = "time", value.name = "timeOut")
但如果不进行两次熔化并执行类似这样的某种操作,我就无法做到这两点
dfLong$timeOut <- dfLong2$timeOut
最终我希望数据框看起来像这样
dfLong$time <- rep(c("time1", "time2", "time3"), each = 10)
dfLong <- dfLong[,which(names(dfLong) %in% c("id", "group", "time", "session", "score", "timeOut"))]
dfLong
有什么办法可以同时熔化两组列?
我们可以使用data.table
library(data.table)
res = melt(setDT(df), measure = patterns("^session", "^time"),
value.name = c("session", "time"))
如果您现在不想学习如何使用 data.tables,您可以 setDF(res)
恢复到 data.frame。
我正在尝试使用 reshape2::melt
向长格式数据帧添加时变预测变量,但我想知道是否有更快的方法。
这里是宽表的玩具数据。在不同的 visits/time 点采取了三种结果变量测量(session1、session2 和 session3)。这三次访问之间的持续时间对于每个参与者都是不同的,最终我想将这些差异纳入模型中。
id <- 1:10
group <- rep(c("A", "B"), times = 5)
session1 <- rnorm(10, 5, 1)
session2 <- rnorm(10, 3, 1)
session3 <- rnorm(10, 7, 2)
time1 <- rep(0, 10)
time2 <- rnorm(10, 24, 0.5)
time3 <- rnorm(10, 48, 0.5)
df <- data.frame(id, group, session1, session2, session3, time1, time2, time3)
现在我想转换成长格式数据框。我使用 reshape2::melt
。我可以像这样围绕分数创建它:
library(reshape2)
dfLong <- melt(df, measure.vars = c("session1", "session2", "session3"), var = "session", value.name = "score")
或者我可以围绕时间值创建它。
dfLong2 <- melt(df, measure.vars = c("time1", "time2", "time3"), var = "time", value.name = "timeOut")
但如果不进行两次熔化并执行类似这样的某种操作,我就无法做到这两点
dfLong$timeOut <- dfLong2$timeOut
最终我希望数据框看起来像这样
dfLong$time <- rep(c("time1", "time2", "time3"), each = 10)
dfLong <- dfLong[,which(names(dfLong) %in% c("id", "group", "time", "session", "score", "timeOut"))]
dfLong
有什么办法可以同时熔化两组列?
我们可以使用data.table
library(data.table)
res = melt(setDT(df), measure = patterns("^session", "^time"),
value.name = c("session", "time"))
如果您现在不想学习如何使用 data.tables,您可以 setDF(res)
恢复到 data.frame。