保留一个月的第一天,即使它在R中重复
假设您有如下数据,如您所见,其中每月的第一天重复多次(注意日期保留一个月的第一天,即使它在R中重复,r,date,R,Date,假设您有如下数据,如您所见,其中每月的第一天重复多次(注意日期变量) 我试图做的是,每个月,根据日期变量,保留所有观察的前几天,即集合中1:6的所有观察。简而言之;每个月的第一天都会出现不止一次,我想保留所有的日子,而不考虑这个月的其他日子 然后,是否可以从剩余的观测值中选择前两个最早的expdate基于步骤1中所做更改的观测值 日期格式为YYYY-mm-dd 到目前为止,我只保留了一个月的头几天,而不是所有这些天。我使用的代码是这样的,但它不会返回所需的结果: setDT(df)[order(
变量)
我试图做的是,每个月,根据日期
变量,保留所有观察的前几天,即集合中1:6
的所有观察。简而言之;每个月的第一天都会出现不止一次,我想保留所有的日子,而不考虑这个月的其他日子
然后,是否可以从剩余的观测值中选择前两个最早的expdate
基于步骤1中所做更改的观测值
日期格式为YYYY-mm-dd
到目前为止,我只保留了一个月的头几天,而不是所有这些天。我使用的代码是这样的,但它不会返回所需的结果:
setDT(df)[order(date), .(delta[which.min(date)], date[which.min(date)]), by = .(year(date), month(date))]
谢谢。可能有一个更有效的答案,但这是可行的:
# if data table is not loaded
library(data.table)
# if dt is a data.frame
setDT(dt)
然后,下面的代码将生成您想要的内容
dt[dt[, .(date=min(date)), by=.(month(date), year(date))][,.(date)], on="date"]
其思想是将原始data.table连接到一个data.table上,其中有一列包含每个月的最短日期。data.table的i参数是一个chained data.table,其中链中的第一个链接返回一个三列data.table,每个月和年份的日期最小,链中的第二个链接删除月和年变量,以仅返回日期变量。此data.table使用on=“date”
参数连接到原始data.table
这是回报
date exdate strike_price delta
1: 1996-01-04 1997-06-21 500000 -0.094917
2: 1996-01-04 1996-03-16 600000 0.768930
3: 1996-01-04 1996-02-17 605000 -0.286091
4: 1996-01-04 1996-12-21 600000 0.651049
5: 1996-01-04 1996-03-16 540000 -0.040929
6: 1996-01-04 1996-02-17 630000 -0.638877
7: 1996-02-04 1997-06-21 500000 -0.094917
8: 1996-02-04 1996-03-16 600000 0.768930
9: 1996-02-04 1996-02-17 605000 -0.286091
10: 1996-02-04 1996-12-21 600000 0.651049
11: 1996-02-04 1996-03-16 540000 -0.040929
12: 1996-02-04 1996-02-17 630000 -0.638877
对于第二步,剩余的两个最低的ExDate(按日期),您可以分两行完成
# save above data.table
dtNew <- dt[dt[, .(date=min(date)), by=.(month(date), year(date))][,.(date)], on="date"]
# merge on the rows of the data.table that have the two lowest exdates
dtNew[dtNew[, .I[rank(exdate) < 3], by=date]$V1,]
#保存上述数据。表格
我在想类似的事情是的!非常感谢。你有没有考虑过问题的第二部分,它稍微有点棘手?请你解释一下最后的部分:“on=”date“,因为它给出了一个未使用论证的错误,这很奇怪;即使我更新了它,我也会得到相同的未使用参数错误newdataah现在有意义了。在此期间,我确实找到了另一种方法(更长的代码),产生了相同的结果!令人惊叹的。非常感谢。你对第二步有什么想法吗?那$V1
?是你上课日期的日期变量?您可以使用str(dt)
进行检查,并使用dt[,date:=as.date(date)]
进行转换,条件是它符合示例中的格式。如果这不是问题所在,那么您应该生成一个数据集,该数据集可以重现您在示例数据集中提到的问题,可能是dput(head(dt,20))
,并查看问题是否在那里重复。我提供的答案适用于示例数据。所有内容都是as.Date
。问题是,因为我有数百个不同的日期,排序依据:rank(exdate)<3
考虑了日期集的所有exdate的排名,而不是每个“组”的日期。同样,只有在没有by=参数的情况下,这才是正确的。在dtNew[,.I[rank(exdate)<3],by=date]
中,rank(exdate)
分别计算每个日期的排名。
# save above data.table
dtNew <- dt[dt[, .(date=min(date)), by=.(month(date), year(date))][,.(date)], on="date"]
# merge on the rows of the data.table that have the two lowest exdates
dtNew[dtNew[, .I[rank(exdate) < 3], by=date]$V1,]
dt <-
structure(list(date = structure(c(9499, 9499, 9499, 9499, 9499,
9499, 9500, 9530, 9530, 9530, 9530, 9530, 9530), class = "Date"),
exdate = c("1997-06-21", "1996-03-16", "1996-02-17", "1996-12-21",
"1996-03-16", "1996-02-17", "1996-02-17", "1997-06-21", "1996-03-16",
"1996-02-17", "1996-12-21", "1996-03-16", "1996-02-17"),
strike_price = c(500000L, 600000L, 605000L, 600000L, 540000L,
630000L, 440000L, 500000L, 600000L, 605000L, 600000L, 540000L,
630000L), delta = c(-0.094917, 0.76893, -0.286091, 0.651049,
-0.040929, -0.638877, 0.579155, -0.094917, 0.76893, -0.286091,
0.651049, -0.040929, -0.638877)), .Names = c("date", "exdate",
"strike_price", "delta"), row.names = c(NA, -13L), class = c("data.table",
"data.frame"), index = structure(integer(0), "`\`__date\``" = integer(0)))