Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
保留一个月的第一天,即使它在R中重复_R_Date - Fatal编程技术网

保留一个月的第一天,即使它在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)))