2017-07-15 2 views
2

J'essaie de supprimer des lignes dans un bloc de données qui se trouvent dans x lignes après les lignes répondant à une certaine condition.Comment faire pour supprimer un tampon de lignes dans un cadre de données autour des lignes d'une certaine condition

J'ai une trame de données avec une variable de réponse, un type de mesure qui représente la condition et l'heure. Voici un ensemble de données fictives:

data <- data.frame(rlnorm(45,0,1), 
     c(rep(1,15),rep(2,15),rep(1,15)), 
     seq(
      from=as.POSIXct("2012-1-1 0:00", tz="EST"), 
      to=as.POSIXct("2012-1-1 0:44", tz="EST"), 
      by="min")) 
names(data) <- c('Variable','Type','Time') 

Dans ce cas, la maquette, je veux supprimer les 5 premières lignes dans un état 1 après l'état 2 se produit.

La façon dont je pensais à la résolution de ce problème était de générer un vecteur distinct qui détermine la distance que chaque observation qui est 1 est de la dernière 2. Voici le code que j'ai écrit:

dist = vector() 
for(i in 1:nrow(data)) { 

    if(data$Type[i] != 1) dist[i] <- 0 

    else { 
     position = i 
     tempcount = 0 
     while(position > 0 && data$Type[position] == 1){ 
      position = position - 1 
      tempcount = tempcount + 1 
     } 
     dist[i] = tempcount 
    } 
} 

Ce code fera l'affaire, mais c'est extrêmement inefficace. Je me demandais si quelqu'un avait des solutions plus intelligentes et plus rapides.

Répondre

1

Si je vous comprends bien, cela devrait faire l'affaire:

criteria1 = which(data$Type[2:nrow(data)] == 2 & data$Type[2:nrow(data)] != data$Type[1:nrow(data)-1]) +1 
criteria2 = as.vector(sapply(criteria1,function(x) seq(x,x+5))) 
data[-criteria2,] 

Comment ça marche:

  1. Criteria1 contient des indices où le type == 2, mais la ligne précédente n'est pas le même type. Les sous-ensembles de lookign étranges comme 2: nrow (données) sont parce que nous voulons comparer à la rangée précédente, mais pour la première rangée il n'y a pas de rangée précédente. Nous ajoutons donc +1 à la fin.
  2. critères2 contient des séquences commençant par le nombre dans Criteria1, ces numéros + 5
  3. la troisième ligne exécute le sous-ensemble

Cela pourrait avoir besoin petite modification, je ne suis pas tout à fait clair quels critères 1 et critères 2 étaient de votre code. Faites-moi savoir si cela fonctionne ou si vous avez besoin de plus de conseils!

+0

Cela fonctionne très bien! Merci! – user2130093

+0

Génial, content d'avoir pu aider. Si vous pouviez accepter ma réponse en cliquant sur la coche, ce serait génial;) – Florian

+0

@ user2130093 Votre question n'est pas claire. Votre titre indique essentiellement "drop rows _around_ rows of condition". Dans le texte, vous écrivez "vouloir supprimer les lignes _après_ la condition (Type = 2?)". Cette réponse supprime les lignes _before_ Type = 2. Veuillez clarifier - faites en sorte que votre exemple soit plus petit et montrez la sortie attendue (par exemple supprimez les variables redondantes et réduisez le nombre de lignes). – Henrik