2010-09-13 1 views
2

J'ai un ensemble de données qui ressemble à ceci:Comment écrire une fonction générique pour déterminer la distance entre les valeurs positives?

  x    y 
1  0.0000 0.4459183993 
2  125.1128 0.4068805502 
3  250.2257 0.3678521348 
4  375.3385 0.3294434397 
5  500.4513 0.2922601919 
6  625.5642 0.2566381551 
7  750.6770 0.2229130927 
8  875.7898 0.1914207684 
9 1000.9026 0.1624969456 
10 1126.0155 0.1364773879 
11 1251.1283 0.1136978589 
12 1376.2411 0.0944717371 
13 1501.3540 0.0786550515 
14 1626.4668 0.0656763159 
15 1751.5796 0.0549476349 
16 1876.6925 0.0458811131 
17 2001.8053 0.0378895151 
18 2126.9181 0.0304416321 
19 2252.0309 0.0231041362 
20 2377.1438 0.0154535572 
21 2502.2566 0.0070928195 
22 2627.3694 -0.0020708606 
23 2752.4823 -0.0119351534 
24 2877.5951 -0.0223944877 
25 3002.7079 -0.0332811155 
26 3127.8208 -0.0442410358 
27 3252.9336 -0.0548855203 
... 

données complètes disponibles here.

Il est plus facile de voir visuellement en traçant x et y avec une ligne d'interception zéro: (. Si vous ne souhaitez pas télécharger les données et tracer vous-même)

ggplot(dat,aes(x,y)) + geom_line() + geom_hline(yintercept=0) 

Vous pouvez voir le tracé here

Je veux choisir les «patches» définis comme la distance le long de x à partir du moment où la ligne passe au-dessus de zéro sur le y jusqu'à ce qu'il passe en dessous de zéro. Cela arrivera toujours au moins une fois (puisque la ligne commence au-dessus de zéro), mais cela peut arriver plusieurs fois.

Il est facile de choisir le premier patch.

patch1=dat[min(which(dat$y<=0.000001)),] 

Mais comment est-ce que je passerais à travers et ramasser les correctifs suivants?

+0

S'il vous plaît utiliser 'dput' pour intégrer vos données dans ce post ... un petit sous-ensemble devrait être suffisant. – Shane

Répondre

3

est ici une solution de travail complète:

# sample data 
df <- data.frame(x=1:10, y=rnorm(10)) 
# find positive changes in "y" 
idx <- which(c(FALSE, diff(df$y > 0) == 1)) 
# get the change in "x" 
patches <- diff(c(0, df[idx, "x"])) 
+0

Désolé ... ne l'avez pas testé. En outre, ajouté une clause supplémentaire à 'idx' afin de ne sélectionner que les valeurs positives. Rétrospectivement, vous pourriez le faire en une seule étape et vérifier simplement la différence entre y> 0 (plutôt que d'utiliser le changement de signe). – Shane

+0

Je veux la différence dans les valeurs x. Donc si ça devient positif à x = 1000 et redescend en dessous de zéro à x = 1400, je veux que patch2 = 400. mais juste la rangée entière pour chacun serait bien parce que je peux traiter ces derniers plus tard. – Maiasaura

+0

Mis à jour avec une solution complète. Vous pouvez transformer ceci en une fonction ou tout mettre sur une ligne (pas besoin d'assigner 'idx'). – Shane