我有一个长格式的学生注册记录(交易)的数据框。
样品:
ID Date Type
123 2/1/14 Entry
123 2/5/14 Exit
123 3/1/14 Entry
123 4/4/14 Exit
234 3/2/14 Entry
234 3/20/14 Exit
234 4/3/14 Entry
我需要通过匹配入口和出口记录对来转换为宽格式。
样品:
ID Entry.Date Exit.Date
123 2/1/14 2/5/14
123 3/1/14 4/4/14
234 3/2/14 3/20/14
234 4/3/14
我可以用来将起始记录与结束记录一起键入的数据中没有固有内容。它只是由学生订购,然后是日期。有些记录是开放式的(没有匹配的退出记录)。
我正在查看某些转换功能,例如重塑,但不知道是否/如何使用这些功能转换为宽格式并将其限制为日期范围对。你会推荐其中之一,还是应该追求不那么优雅的东西? 谢谢!
答案 0 :(得分:2)
这是使用data.table
的单向方式。我们的想法是按ID, Type
进行分组,并添加一个标识进入/退出对的附加列。这假设数据总是具有彼此相邻的正确进入/退出对,除非缺少任何一个。
require(data.table) ## >= 1.9.0
setDT(dat) ## dat is your data. converted to data.table now.
dat[, ID2 := seq_len(.N), by=list(ID, Type)]
# dat
# ID Date Type ID2
# 1: 123 2/1/14 Entry 1
# 2: 123 2/5/14 Exit 1
# 3: 123 3/1/14 Entry 2
# 4: 123 4/4/14 Exit 2
# 5: 234 3/2/14 Entry 1
# 6: 234 3/20/14 Exit 1
# 7: 234 4/3/14 Entry 2
现在使用dcast
将其转换为宽格式。当然,您也可以从reshape2
使用它。但是data.table
现在有自己的实现并且更快,所以我会在这里使用它。
dcast.data.table(dat, ID + ID2 ~ Type, value.var="Date")
# ID ID2 Entry Exit
# 1: 123 1 2/1/14 2/5/14
# 2: 123 2 3/1/14 4/4/14
# 3: 234 1 3/2/14 3/20/14
# 4: 234 2 4/3/14 NA
HTH