r - 使用多个 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 的组合保持在一起?
解决方案
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
推荐阅读
- python - 在python中比较多维分布的测试
- reactjs - 如何在 ag-grid(react)树数据中的下拉箭头旁边显示孩子的数量?
- typescript - 打字稿 - 从参数元组中删除最后一个元素,取消最后一个参数
- angular - 创建“任何”类型的扩展方法。错误:“任何”仅指一种类型,但在此处用作值
- c# - MaterialPropertyBlock 在运行时不会改变颜色?
- android - 如何在 Android 中创建自定义画笔
- javascript - Gridstack - 如果我在重新初始化之前破坏网格,则稍后会失败
- azure - 如何永久清除在启用软删除的情况下创建的整个 azure keyvault?
- python - 这个 Python 代码中的 [:5] 和 [5] 有什么区别?
- docker - 如何创建在 docker 中运行的自由式 jenkins 作业