我想从经典"时间* OHLC"创建以下data.frame;交换数据的数据格式。
起点是以下数据框:
Date Time Open High Low Close
01/28/2002 0833 543.81 543.82 543.84 543.85
01/28/2002 0850 542.95 542.95 542.95 542.95
01/28/2002 0901 542.45 542.45 542.45 542.45
01/28/2002 0911 542.45 542.45 542.45 542.45
我的表中有1534129行。将数据移动到以下结构中我有点绝望:
Date Time Price
01/28/2002 0833 543.81
01/28/2002 0833 543.82
01/28/2002 0833 543.84
01/28/2002 0833 543.85
01/28/2002 0850 542.95
这就是应该如何重写第一行的方式,并且应该在原始文件的每一行上重复此扩展。我的任务的第二部分是设置一个参数(分布),它将决定在条形创建阶段是高还是低。这当然会对以后的数据操作产生进一步的影响,但我还没有达到起点。
稍后,我想使用代码并决定当你选择总是高时数据的样子,然后首先创建低(和相反),或者最困难的事情,因为它没有确定性地完成,是具有分布的版本将决定哪个先行。
希望它完全描述任务(问题)。我很高兴每一个提示或想法。谢谢你的帮助。
答案 0 :(得分:3)
尝试
library(tidyr)
library(dplyr)
df1 <- df %>%
gather(Var, Price, Open:Close) %>%
arrange(Date, Time) %>%
select(-Var)
head(df1)
# Date Time Price
#1 01/28/2002 0833 543.81
#2 01/28/2002 0833 543.82
#3 01/28/2002 0833 543.84
#4 01/28/2002 0833 543.85
#5 01/28/2002 0850 542.95
#6 01/28/2002 0850 542.95
df <-structure(list(Date = c("01/28/2002", "01/28/2002", "01/28/2002",
"01/28/2002"), Time = c("0833", "0850", "0901", "0911"), Open = c(543.81,
542.95, 542.45, 542.45), High = c(543.82, 542.95, 542.45, 542.45
), Low = c(543.84, 542.95, 542.45, 542.45), Close = c(543.85,
542.95, 542.45, 542.45)), .Names = c("Date", "Time", "Open",
"High", "Low", "Close"), row.names = c(NA, -4L), class = "data.frame")
答案 1 :(得分:2)
使用&#34; data.table&#34;,您可以通过以下方式获取长篇数据:
library(data.table)
as.data.table(df)[, list(Price = unlist(.SD)), by = list(Date, Time)]
# Date Time Price
# 1: 01/28/2002 0833 543.81
# 2: 01/28/2002 0833 543.82
# 3: 01/28/2002 0833 543.84
# 4: 01/28/2002 0833 543.85
# 5: 01/28/2002 0850 542.95
# 6: 01/28/2002 0850 542.95
# 7: 01/28/2002 0850 542.95
# 8: 01/28/2002 0850 542.95
# 9: 01/28/2002 0901 542.45
# 10: 01/28/2002 0901 542.45
# 11: 01/28/2002 0901 542.45
# 12: 01/28/2002 0901 542.45
# 13: 01/28/2002 0911 542.45
# 14: 01/28/2002 0911 542.45
# 15: 01/28/2002 0911 542.45
# 16: 01/28/2002 0911 542.45
或者,您也可以查看melt
,这对我来说似乎更安全,因为您不会丢失任何信息(您的列名称)。