【发布时间】:2012-12-06 21:40:17
【问题描述】:
每天 (TRADEDATE) 我有一个由 BOOK 和 COMMODITY 唯一标识的条目。每个条目都有一个每日变化的现值 (PV)。我想得到一个列,其中包含 PV 与上个月最后一个日历日的差异。 我通过循环解决了它,但我想知道是否有人可以提出更优雅(更快的解决方案):
library(data.table)
bwTab
COMMODITY BOOK TRADEDATE PV Desired Column
1: CASH HS_OPT_GEN 2012-09-30 66669.68 NA
2: CASH HS_OPT_GEN 2012-10-01 76333.83 9664.15
3: CASH HS_OPT_GEN 2012-10-02 76333.83 9664.15
4: CASH HS_OPT_GEN 2012-10-03 76333.83 9664.15
5: CASH HS_OPT_GEN 2012-10-04 76333.83 9664.15
---
3050: OIL HO_OIL_FIN 2012-09-30 21330.55 NA
---
3066: OIL HO_OIL_FIN 2012-10-26 42661.28 21330.73
3067: OIL HO_OIL_FIN 2012-10-27 21330.69 0.14
3068: OIL HO_OIL_FIN 2012-10-28 21330.68 0.13
3069: OIL HO_OIL_FIN 2012-10-29 21330.78 0.23
# Here is my solution
# Define a function for last day of previous month
pme <- function(date) {as.Date(paste("01",month(date),year(date),sep="."),"%d.%m.%Y")-1}
difftopme <- function(a) {
if (nrow(bwTab[COMMODITY==a[,COMMODITY] & BOOK==a[,BOOK] & TRADEDATE==pme(a[,STICHTAG]),])==0) {NA} else {
a[,PV]-bwTab[COMMODITY==a[,COMMODITY] & BOOK==a[,BOOK] & TRADEDATE==pme(a[,TRADEDATE]),PV] }
}
for (i in 1:nrow(bwTab)){a <- difftopme(bwTab[i,]) ; if (i==1){diffPVme <- a} else {diffPVme <- c(a,diffPVme)}}
#########################
dput(bwTab[1000:1010,])
structure(list(COMMODITY = c("ELEC", "ELEC", "ELEC", "ELEC",
"ELEC", "ELEC", "ELEC", "ELEC", "ELEC", "ELEC", "ELEC"), BOOK = c("HS_OUK_MKT",
"HS_OUK_MKT", "HS_OUK_MKT", "HS_OUK_MKT", "HS_OUV_EVO", "HS_OUV_EVO",
"HS_OUV_EVO", "HS_OUV_EVO", "HS_OUV_EVO", "HS_OUV_EVO", "HS_OUV_EVO"
), STICHTAG = structure(c(1353798000, 1353970800, 1354057200,
1354143600, 1348956000, 1349042400, 1349128800, 1349215200, 1349301600,
1349388000, 1349474400), class = c("POSIXct", "POSIXt"), tzone = ""),
BROKERAGE = c(123406.66, 61791.17, 62229.17, 62492.57, 0,
0, 0, 0, 0, 0, 0), DV = c(72873524.86, 38096138.75, 38283589.07,
38236199.05, 23171721.81, 23178889.59, 23187553.93, 23187426.98,
23173154.67, 23149439.13, 23149469.88), REALIZED = c(47002372.1,
23501186.05, 23501186.05, 23501186.05, 22961528, 22961528,
22961528, 22961528, 22961528, 22961528, 22961528), PV = c(25871152.76,
14594952.7, 14782403.02, 14735013, 210193.81, 217361.59,
226025.93, 225898.98, 211626.67, 187911.13, 187941.88), PV_ND = c(25973196.64,
14654807.46, 14843080.44, 14795220.35, 210222.01, 217386.44,
226048.76, 225920.76, 211641.41, 187919.95, 187949.85), BROKER_R = c(0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0), CREDIT_R = c(0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0), STRUCTURE_R = c(0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0), BROKER_UR_D = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
), CREDIT_UR_D = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), STRUCTURE_UR_D = c(0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0), BROKER_UN_UND = c(0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0), CREDIT_UN_UND = c(0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0), STRUCTURE_UN_UND = c(0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0)), .Names = c("COMMODITY", "BOOK", "STICHTAG",
"BROKERAGE", "DV", "REALIZED", "PV", "PV_ND", "BROKER_R", "CREDIT_R",
"STRUCTURE_R", "BROKER_UR_D", "CREDIT_UR_D", "STRUCTURE_UR_D",
"BROKER_UN_UND", "CREDIT_UN_UND", "STRUCTURE_UN_UND"), sorted = c("COMMODITY",
"BOOK", "STICHTAG"), class = c("data.table", "data.frame"), row.names = c(NA,
-11L), .internal.selfref = <pointer: 0x014024a0>)
【问题讨论】:
-
WTF?您使用
data.table(仅3k 行并不真正需要),然后使用for循环遍历行?能否请您使用dput提供data.table 的代表部分? -
也请清理你的草率代码;)如果你懒得自己做,watch this video
-
嗨 Roland,我复制了上面 dput 的结果。我使用 data.table 主要是因为我已经习惯了(我觉得语法很方便)。
-
您输入的
bwTab与您在示例中的不相同。 (即,没有TRADEDATE) -
嗨,里卡多,你是对的。我试着举一个简化的例子。 TRADEDATE 将是 dput 中的 STICHTAG。
标签: r data.table