首页 > 解决方案 > 使用多个 timevar 重塑数据表

问题描述

我有一个数据集DT,其中每一行代表一个人在比赛中的表现:

个人ID 比赛日期 种族ID finPos
人1 2009-08-14 489801 2
人1 2010-04-17 502397 6
人1 2011-03-10 524554 4
人2 2009-08-14 489801 1
人2 2011-03-10 524554 3
... ... ... ...

我想转换数据集,以便每人有 1 行,并且按照比赛日期的顺序排列他们的比赛表现(对于没有参加特定比赛的个人,NA 值)。例如:

个人ID 489801 finPos 502397 finPos 524554 finPos
人1 2009-08-14 2 2010-04-17 6 2011-03-10 4
人2 2009-08-14 1 不适用 不适用 2011-03-10 3

我知道我可以通过 reshape2 获得其中的一部分,例如:

reshape(DT, direction = "wide", idvar = "raceID", timevar = "raceDate")

但是有没有办法确保raceID/raceDat/finishPos 的组合保持在一起?

标签: rdataframereshapetidyrreshape2

解决方案


data.table方法

library(data.table)
DT <- fread("personID   raceDate    raceID  finPos
person1     2009-08-14  489801  2
person1     2010-04-17  502397  6
person1     2011-03-10  524554  4
person2     2009-08-14  489801  1
person2     2011-03-10  524554  3")

# Cast to wide
cols <- c("raceDate", "finPos")  #value columns to cast
answer <- dcast(DT, personID ~ raceID, value.var = cols, drop = FALSE)

现在数据被转换为宽,但按值变量“分组”。您现在需要做的就是重新排列列...

# Determine column order
new_col_order <- CJ( sort(unique(DT$raceID)), cols, sorted = FALSE)[, paste(cols, V1, sep = "_")]
# Set new column order
setcolorder(answer, c(setdiff(names(answer), new_col_order), new_col_order))
#    personID raceDate_489801 finPos_489801 raceDate_502397 finPos_502397 raceDate_524554 finPos_524554
# 1:  person1      2009-08-14             2      2010-04-17             6      2011-03-10             4
# 2:  person2      2009-08-14             1            <NA>            NA      2011-03-10             3

推荐阅读