2017-10-12 18 views
1

je l'extrait suivant de mon ensemble de données:Autoriser les doublons de sélection de rangée en utilisant un intervalle dans 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 

Nous voudrions pouvoir sélectionner les intervalles [-1: 1], ce qui correspond à la veille et le lendemain d'une rétrogradation. A la ligne où la colonne "Agence de notation" n'est pas "NA" indique qu'un déclassement s'est produit. Dans mon exemple ci-dessus, les lignes [1717: 1719] et [1718: 1720], donc 6 lignes, pour chaque niveau inférieur 3.

Mon jeu de données a 45276 entrées avec 536 déclassements (colonne "Agence de notation" n'est pas "NA") où je voudrais construire une liste contenant les 3 lignes où une rétrogradation s'est produite.

Je l'ai essayé en utilisant le code suivant:

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

Cela fonctionne s'il n'y a pas de révisions à la baisse sur les jours consécutifs. Cependant, dans mon exemple de l'extrait que j'ai deux révisions à la baisse juste après l'autre et je reçois la sortie suivante:

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 

avoir 4 rangs au lieu de 6 dont j'ai besoin.

Je suppose que la fonction unique() empêche les lignes en double, mais dans mon exemple j'ai besoin de ces lignes comme décrit ci-dessus.

Comment puis-je résoudre ce problème?

Répondre

1

Voici une solution possible pour obtenir précédent et suivant la ligne pour chaque ligne correspondante:

> 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 

Dans cette solution, les lignes se chevauchent 1719 et 1718 sont présentés deux fois.

+0

Mais j'ai un grand ensemble de données de 45726 entrées composé, entrant donc chaque ligne problemtic est séparément un peu incommode. – rbonac

0

trouvé une solution simple par moi-même sans utiliser le unique funciton:

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

Je pensais aussi à celui-ci, mais dans cette solution l'ordre de keepindex ne spécifie pas la rangée précédente et la rangée suivante pour chaque rangée. > c (keepindex-1, keepindex, keepindex + 1) [1] 1717 1718 1718 1719 1719 1720 – Heikki