2017-10-12 123 views
1

使用间隔我有数据集的以下提取物:允许在行选择重复的行中的R

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”表示降级已发生。在我上面的示例中,对于每个降级3,行[1717:1719]和[1718:1720],因此为6行。

我的数据集包含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()功能可防止重复行,但在我的例子中,我需要为上述这些行。

我该如何解决这个问题?

回答

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被示出两次。

+0

但是我有一个大的数据集,包括45726个条目,因此进入每个problemtic行分别是有点不方便。 – rbonac

0

发现自己是一个简单的解决方案,而无需使用unique功能可按:

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

我也想过这一个,但在这个解决方案keepindex的顺序并不为每行指定一个和下一个行。 > C(keepindex-1,keepindex,keepindex + 1) [1] 1717 1718 1718 1719 1719 1720 – Heikki