【问题标题】:Allow duplicate rows in row selection using an interval in R允许使用 R 中的间隔在行选择中重复行
【发布时间】:2017-10-12 09:46:32
【问题描述】:

我的数据集有以下摘录:

basisanddowngradessingledates[1716:1721, ]
# A tibble: 6 x 23
   Dates                   Bank     CDS     Bond     `Swap zero rate`   `CDS-bond basis` `Basis change` `Rating agency`
  <dttm>                  <chr>  <dbl>    <dbl>            <dbl>            <dbl>          <dbl>           <chr>
1 2015-05-15 Allied Irish Banks PLC 129.63 201.0235             40.6        -30.79352      1.9408116              NA
2 2015-05-18 Allied Irish Banks PLC 129.64 202.1998             41.0        -31.55976     -0.7662374              NA
3 2015-05-19 Allied Irish Banks PLC 129.65 200.4579             39.0        -31.80792     -0.2481631           Fitch
4 2015-05-20 Allied Irish Banks PLC 129.65 203.9960             39.0        -35.34598     -3.5380550            DBRS
5 2015-05-21 Allied Irish Banks PLC 129.63 203.5341             41.0        -32.90415      2.4418300              NA
6 2015-05-22 Allied Irish Banks PLC 130.64 203.2723             40.0        -32.63234      0.2718045              NA

我想选择区间 [-1:1],它对应于降级的前一天和后一天。在“评级机构”列不为“NA”的行中,表示发生了降级。在我上面的示例中,行 [1717:1719] 和 [1718:1720],因此 6 行,每次降级 3。

我的数据集有 45276 个条目,其中 536 次降级(“评级机构”列不是“NA”),我想在其中构建一个列表,其中包含发生降级的 3 行。

我用下面的代码试了一下:

keepindex <- which(basisanddowngradessingledates[,8] != "NA")
interval11 <- unique(c(keepindex-1, keepindex, keepindex+1))
interval1ra1 <- basisanddowngradessingledates[interval11,]

如果连续几天没有降级,则此方法有效。但是在我的示例摘录中,我有两个降级之后,我得到以下输出:

print(interval1ra1[c(11:12, 348, 674), ])
# A tibble: 4 x 23
   Dates                   Bank    CDS     Bond      `Swap zero rate` `CDS-bond basis` `Basis change` `Rating agency`
  <dttm>                  <chr>  <dbl>    <dbl>            <dbl>            <dbl>          <dbl>           <chr>
1 2015-05-18 Allied Irish Banks PLC 129.64 202.1998               41        -31.55976     -0.7662374              NA
2 2015-05-19 Allied Irish Banks PLC 129.65 200.4579               39        -31.80792     -0.2481631           Fitch
3 2015-05-20 Allied Irish Banks PLC 129.65 203.9960               39        -35.34598     -3.5380550            DBRS
4 2015-05-21 Allied Irish Banks PLC 129.63 203.5341               41        -32.90415      2.4418300              NA

我得到 4 行而不是我需要的 6 行。

我猜unique()function 可以防止重复行,但在我的示例中,我需要如上所述的这些行。

我该如何解决这个问题?

【问题讨论】:

    标签: r select duplicates unique


    【解决方案1】:

    这是获取每个匹配行的上一行和下一行的一种可能解决方案:

    > keepindex = c(1718,1719)
    > lookupindex = c();
    > for (lookupindex in keepindex) { result = c(lookupindex ,index-1,index,index+1) }
    > lookupindex 
    [1] 1717 1718 1719 1718 1719 1720
    

    在此解决方案中,重叠的行 1719 和 1718 显示了两次。

    【讨论】:

    • 但是我有一个包含 45726 个条目的大数据集,因此单独输入每个有问题的行有点不方便。
    【解决方案2】:

    在不使用unique函数的情况下自己找到了一个简单的解决方案:

    keepindex <- which(basisanddowngradessingledates[,8] != "NA")
    interval1ra1 <- basisanddowngradessingledates[c(keepindex-1,keepindex, 
    keepindex+1), ]
    

    【讨论】:

    • 我也想过这个,但是在这个解决方案中,keepindex 的顺序没有为每一行指定上一行和下一行。 > c(keepindex-1, keepindex, keepindex+1) [1] 1717 1718 1718 1719 1719 1720
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 2021-07-28
    • 2020-02-08
    • 2017-04-01
    • 2011-02-04
    • 1970-01-01
    相关资源
    最近更新 更多