我正在使用一个数据框架,该数据框架由参与者跨越多个时间点的数据组成。我正在尝试将数据帧从长格式转换为宽格式。数据框架由属于不同数据类型(如日期和数字)的变量组成。
library(data.table)
SN <- c("AAA", "BBB", "BBB", "CCC", "DDD", "EEE", "DDD")
Timepoint <- c(1, 1, 2, 1, 1, 1, 2)
date <- c("31-Mar-17", "08-Mar-17", "31-Mar-18", "28-Mar-18", "17-Mar-17", "26-Feb-18", "07-Apr-18")
score <- c(13, 16, 17, 9, 14, 15, 15)
age <- c(12, 15, 16, 9, 14, 14, 15)
df <- data.frame(SN, Timepoint, date, score, age)
df$date <- as.Date(df$date, format = "%d-%B-%y")我使用以下代码将数据从长格式转换为宽格式:
df2 <- dcast(melt(df, id.vars = c("SN", "Timepoint")),
SN ~ Timepoint + variable, value.var = "value")当R将所有变量解释为属于公共类型(数值)时,日期变量被错误地转换为数值变量。
以下是我获得的不正确的输出:

我所要达到的正确结果如下:

谢谢!非常感谢你的帮助!
发布于 2018-05-09 12:39:25
我们可能还需要在id.vars中将“date”作为numeric中的“value”列,并通过混合两个类将其转换为单个类,即数字类。相反,如果我们有两个单独的列,并使用来自value.var的data.table::dcast (接受多个变量)
dcast(melt(setDT(df), id.vars = c("SN", "Timepoint", "date")),
SN ~ Timepoint + variable, value.var = c("date", "value"))根据预期的输出,我们可能只需要dcast
dcast(setDT(df)[], SN ~ Timepoint, value.var = c('date', 'score', 'age'))发布于 2018-05-09 13:06:18
另一种方法是将日期变量转换为数据重组后的日期,而不是以前。dplyr包便于根据名称更改所有列,例如以日期结尾的列。
library(data.table)
library(dplyr)
SN <- c("AAA", "BBB", "BBB", "CCC", "DDD", "EEE", "DDD")
Timepoint <- c(1, 1, 2, 1, 1, 1, 2)
date <- c("31-Mar-17", "08-Mar-17", "31-Mar-18", "28-Mar-18", "17-Mar-17", "26-Feb-18", "07-Apr-18")
score <- c(13, 16, 17, 9, 14, 15, 15)
age <- c(12, 15, 16, 9, 14, 14, 15)
df <- data.frame(SN, Timepoint, date, score, age)
df2 <- dcast(melt(df, id.vars = c("SN", "Timepoint")),
SN ~ Timepoint + variable, value.var = "value") %>%
mutate_at(vars(ends_with("date")), as.Date, format = "%d-%B-%y")https://stackoverflow.com/questions/50253616
复制相似问题