2014-01-24 3 views
5

Nehmen wir an, ich habe eine Antwortvariable, die mit der Zeit steigt und fällt. Jedes Mal, wenn die Antwortvariable über einen Schwellenwert steigt, haben wir eine neue "Testversion". Das heißt, wenn ich eine Spalte Threshold, das heißt TRUE ist, wenn sie über einem bestimmten Wert liegen, bilden aufeinanderfolgende Blöcke von Datenpunkten, bei denen ThresholdTRUE ist, einen neuen Versuch.Binning Daten nach einem Schwellenwert?

Time <- seq(1, 10, by = 0.5) 
Response <- abs(sin(Time)) 
Threshold <- Response > 0.6 
data <- data.frame(Time, Response, Threshold) 

Time, Response, gegeben und Threshold, wie könnte ich mich über einen Trial Faktor hinzufügen, die für jede Gruppe von TRUE Schwellen einen neuen Wert hat? Etwas wie folgt aus:

Time Response Threshold Trial 
1 1.0 0.84147098  TRUE A 
2 1.5 0.99749499  TRUE A 
3 2.0 0.90929743  TRUE A 
4 2.5 0.59847214  FALSE NA 
5 3.0 0.14112001  FALSE NA 
6 3.5 0.35078323  FALSE NA 
7 4.0 0.75680250  TRUE B 
8 4.5 0.97753012  TRUE B 
9 5.0 0.95892427  TRUE B 
10 5.5 0.70554033  TRUE B 
11 6.0 0.27941550  FALSE NA 
12 6.5 0.21511999  FALSE NA 
13 7.0 0.65698660  TRUE C 
14 7.5 0.93799998  TRUE C 
15 8.0 0.98935825  TRUE C 
16 8.5 0.79848711  TRUE C 
17 9.0 0.41211849  FALSE NA 
18 9.5 0.07515112  FALSE NA 
19 10.0 0.54402111  FALSE NA 

Antwort

3
data$Trial <- factor(
    ifelse(data$Threshold, cumsum(!data$Threshold), NA), labels = c("A", "B", "C") 
) 

## Time Response Threshold Trial 
## 1 1.0 0.84147098  TRUE  A 
## 2 1.5 0.99749499  TRUE  A 
## 3 2.0 0.90929743  TRUE  A 
## 4 2.5 0.59847214  FALSE <NA> 
## 5 3.0 0.14112001  FALSE <NA> 
## 6 3.5 0.35078323  FALSE <NA> 
## 7 4.0 0.75680250  TRUE  B 
## 8 4.5 0.97753012  TRUE  B 
## 9 5.0 0.95892427  TRUE  B 
## 10 5.5 0.70554033  TRUE  B 
## 11 6.0 0.27941550  FALSE <NA> 
## 12 6.5 0.21511999  FALSE <NA> 
## 13 7.0 0.65698660  TRUE  C 
## 14 7.5 0.93799998  TRUE  C 
## 15 8.0 0.98935825  TRUE  C 
## 16 8.5 0.79848711  TRUE  C 
## 17 9.0 0.41211849  FALSE <NA> 
## 18 9.5 0.07515112  FALSE <NA> 
## 19 10.0 0.54402111  FALSE <NA> 
2

Eine weitere Möglichkeit mit rle:

r <- with(data, rle(Threshold)) 
len <- with(r, lengths[values]) 
n <- length(len) 

trial <- rep(x = LETTERS[1:n], times = len) 

data$Trial[data$Threshold] <- trial 

data 
+0

+1. Dies wäre schneller als Jakes Antwort, insbesondere wenn die Daten größer werden. Es kann weiter optimiert werden. Siehe hier: https://gist.github.com/mrdwab/8601445 – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto, danke für deine Kommentare und Verbesserungsvorschläge! – Henrik

Verwandte Themen